sh: 1: 프로그램을 찾을 수 없습니다

sh: 1: 프로그램을 찾을 수 없습니다

설치된 프로그램을 호출하여 파일을 하나씩 실행하는 스크립트를 작성했습니다. 동일한 프로그램이 와 같은 터미널에서 실행되면 procheck abc.pdb정상적으로 작동합니다. 하지만 Perl 스크립트에서 이 프로그램을 실행하면

#!/usr/bin/perl -w
@proc = glob '*.pdb';

foreach $proc (@proc)

{
     system ('procheck $proc 2.0');
}

에러 발생됨

sh: 1: procheck: not found 

답변1

여기서 문제가 될 수 있는 두 가지 사항이 있습니다. 첫째, 작은따옴표로 묶인 문자열을 사용하면 변수가 확장되지 않으므로 system()호출 시 리터럴 문자열이 표시됩니다 procheck $proc 2.0. 여기에는 쉘 특정 문자( $)가 포함되어 있기 때문에 Perl은 쉘을 통해 명령을 실행하므로 쉘은 이를 확장할 기회를 갖습니다. 환경에 변수가 포함되어 있지 않으면 proc아무 것도 확장되지 않습니다. 하지만 쉘은 그렇게 할 procheck수 없을 것 같기 때문에 문제가 되지 않습니다 PATH.

따옴표를 큰따옴표로 변경하면 Perl은 변수를 확장합니다(루프에서 변수를 사용하고 있기 때문에 아마도 원하는 것일 것입니다). 그러나 Perl로부터 찾을 수 없다는 메시지를 받을 수도 있습니다 procheck.

해결책은 프로그램의 전체 경로를 제공하거나 해당 경로가 스크립트에 있는지 확인하는 것입니다 PATH.

대화형 셸에서 실행하면 작동할 수 있지만 procheck실제로는 별칭이나 함수일 수 있습니다. 일반적인 실행 파일이라면 에 있을 것이고 PATHPerl과 하위 쉘을 상속해야 합니다. 예를 들어 Bash에서는 type -a procheck실제로 실행되는 내용과 별칭 뒤에 숨겨진 디스크 파일과 같은 대안이 있는지 확인하는 데 사용할 수 있습니다 .


아, 그리고 명령을 실행할 때 쉘이 필요하지 않은 경우 system목록 형식을 사용하고 명령의 인수를 별도의 인수로 전달하여 Perl이 실수로 명령을 호출하는 것을 방지 할 수 있습니다 system. 여기 있습니다 system("procheck", $proc, "2.0").

답변2

문제는 작은따옴표를 사용하고 있다는 것입니다.

이거 한번 해봐...

system ("procheck $proc 2.0");

관련 정보