![sh: 1: 프로그램을 찾을 수 없습니다](https://linux55.com/image/121301/sh%3A%201%3A%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%84%20%EC%B0%BE%EC%9D%84%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4.png)
설치된 프로그램을 호출하여 파일을 하나씩 실행하는 스크립트를 작성했습니다. 동일한 프로그램이 와 같은 터미널에서 실행되면 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
실제로는 별칭이나 함수일 수 있습니다. 일반적인 실행 파일이라면 에 있을 것이고 PATH
Perl과 하위 쉘을 상속해야 합니다. 예를 들어 Bash에서는 type -a procheck
실제로 실행되는 내용과 별칭 뒤에 숨겨진 디스크 파일과 같은 대안이 있는지 확인하는 데 사용할 수 있습니다 .
아, 그리고 명령을 실행할 때 쉘이 필요하지 않은 경우 system
목록 형식을 사용하고 명령의 인수를 별도의 인수로 전달하여 Perl이 실수로 명령을 호출하는 것을 방지 할 수 있습니다 system
. 여기 있습니다 system("procheck", $proc, "2.0")
.
답변2
문제는 작은따옴표를 사용하고 있다는 것입니다.
이거 한번 해봐...
system ("procheck $proc 2.0");