shebang 회선이 cr-lf와 작동하지 않음


10

다음 기본 스크립트의 shebang 부분이 작동하지 않는 이유 :

$ cat hello.sh
#! /bin/sh
echo Hello
$ ./hello.sh
bash: ./hello.sh: /bin/sh^M: bad interpreter: No such file or directory

$ cat hello.py
#! /usr/bin/env python3
print("Hello")
$ ./hello.py
: No such file or directory

반면 인터프리터를 수동으로 호출하면 작동합니다.

$ sh hello.sh
Hello
$ python3 hello.py
Hello

답변:


11

스크립트에는 아마도 DOS 스타일 CR-LF 줄 끝이 있고 Unix 스타일 LF 줄 끝은 없을 것입니다. 첫 번째 경우 오류 메시지에 표시된 ^ M은 0D 문자가 스크립트 인터프리터 이름의 일부로 해석되고 줄 끝의 일부로 해석되지 않았 음을 나타냅니다 (예상대로). 시스템에 문자 0D (^ M)가 포함 된 경로가있는 실행 파일이 없으므로 시스템이 인터프리터를 호출 할 수 없습니다. 인터프리터를 수동으로 호출하면 스크립트에있는 두 가지 종류의 줄 끝을 모두 처리 할 수 ​​있습니다.

스크립트를 Unix 스타일의 LF 줄 끝을 사용하도록 변환하면 shebang이 작동하는 것을 볼 수 있습니다. 그림을 읽으십시오.

아래 세션에서 할 일과 할 일은 줄 끝 규칙을 CR-LF에서 LF로 변환 하는 유틸리티 (패키지로 우분투에서 사용 가능 tofrodos)입니다. 동등한 유틸리티 ( 이 unix.SE 질문 참조 )는 데모 목적으로 수행됩니다.

다음과 같은 세션 스크립트 (동일한 스크립트 파일로 실행)는 상황을 명확히해야합니다.

$ fromdos hello.sh
$ ./hello.sh
Hello
$ todos hello.sh
$ ./hello.sh
bash: ./hello.sh: /bin/sh^M: bad interpreter: No such file or directory
$
$ fromdos hello.py
$ ./hello.py
Hello
$ todos hello.py
$ ./hello.py
: No such file or directory
$

보인다 는 대회 종료 CR-LF 라인의 일부로 CR을 인식하지 못하는 오두막 라인을 읽어 커널과 (적어도 내 쿠분투 건방진 시스템의 버전 기준) 분명히 리눅스 커널이다.

스크립트의 shebang이 작동하지 않는 것 같습니다 (예 : 스크립트에서 인터프리터를 수동으로 호출해도 작동하지만 파일 이름을 사용하여 스크립트를 실행할 수는 없습니다 chmod +x). 이것이 가능한 이유입니다.

참고 : 다른 사람들에게도 감사드립니다. 더 나은 답변이 있으면 기뻐할 것입니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.