Ubuntu 20.04 LTS에서 Perl 스크립트를 만들었습니다. 문제가 없으며 작동합니다. 나는 데비안이 설치된 다른 컴퓨터에 이 스크립트를 넣었습니다. 실행되지 않습니다:
./my_script.pl
이것은 나에게 ./my_script.pl Command not found
다음을 제공합니다.
perl my_script.pl
왜? 속성은 -rwx--x--x
이므로 모든 것이 괜찮을 것입니다.
내 셔뱅은 다음과 같습니다.#!/bin/perl
답변1
Debian의 Perl 스크립트에 대한 올바른 shebang은 다음과 같습니다.
#!/usr/bin/perl
이는 Ubuntu, Debian 및 기타 여러 배포판과 Unix 계열 시스템에서 작동합니다.
/bin/perl
Ubuntu 시스템에 적용되는 이유는 다음과 같습니다./
많은 사람들 사이에서 "공유"된 디렉토리를 병합합니다 ./usr
, /bin
및 을 포함하여 /usr/bin
를 /usr/bin/perl
사용할 수도 있습니다 /bin/perl
.
답변2
./my_script.pl
=>Command not found
작동하지만perl my_script.pl
이는 스크립트가 Windows 스타일 CR/LF
줄 종결자를 사용하고 있거나 UTF-8 "BOM" 서명으로 시작할 수 있음을 나타냅니다.
이런 경우인지 확인할 수 있습니다
cat -v ./my_script | sed 1q
^M
그리고 끝이나 시작 부분에서 M-oM-;M-?
(캐리지 리턴)을 찾으세요 .
예:
$ cat ./script
#! /usr/bin/perl
print "hello\n"
$ perl ./script
hello
$ ./script
/bin/sh: 1: ./script: not found
$ cat -v ./script
#! /usr/bin/perl^M
print "hello\n"^M
Bash(대시 제외) 또는 대부분의 다른 프로그램은 /usr/bin/perl^M: bad interpreter
.
Perl 자체는 스크립트의 캐리지 리턴에 관심이 없으며 스크립트의 캐리지 리턴에만 관심이 있습니다. 다른 공백 문자처럼 처리됩니다.
$ cat ./foo
print "hello\n"
$ perl ./foo
LOL
$ cat -v ./foo
print "LOL\n";^M#^Mprint "hello\n"
속성은
-rwx--x--x
이므로 모든 것이 괜찮을 것입니다.
이것은 일반적으로 작동하지 않습니다. 이러한 스크립트는 해당 소유자만 사용할 수 있습니다. 실행파일과 다르게바이너리 파일, 실행 가능 파일스크립트그것은해야한다읽을 수 있는이를 실행하는 사용자에 의해.
-rwxr-xr-x
( ) 로 바꿔야 합니다 chmod 0755
.
내 셔뱅은 다음과 같습니다.
#!/bin/perl
이미 언급했듯이 이 shebang은 이식성이 없습니다. 대신 이것을 사용하십시오 (그리고 NUL, BOM 또는 양방향 태그 ;-)와 같은 다른 "보이지 않는" 문자를 포함하지 않고 #! /usr/bin/perl
끝나지 않는지 확인하십시오 ).CR/LF
웜을 열 수 있으므로 사용하지 마십시오 #! /usr/bin/env perl
. 스크립트는 사용자가 경로에 있을 수 있는 모든 야생 Perl 버전과 호환되어야 하며 나중에 기본 인수를 추가할 수 없습니다 perl
. --
) 대시)로 시작하는 심볼릭 링크를 통해 스크립트가 호출되는 것을 방지합니다.
답변3
확실히 한 상자에서 다른 상자로 이동하는 경로 문제입니다.
which perl
우분투 컴퓨터에서 실행하고 데비안 컴퓨터에서도 동일한 작업을 수행합니다.
뿐만 아니라 echo $PATH
두 상자 모두에서 실행됩니다.
Perl의 전체 경로를 사용하여 실행해 보십시오.