답변:
소싱 ( . test.sh ) 스크립트를 실행하고 그것을 실행 ( test.sh 또는 ./test.sh )가 첫 줄에 있습니다.
스크립트를 소스하는 경우 첫 번째 행은 주석이며 무시됩니다. 그러나 당신이 그것을 실행하면 첫 번째 라인은 처음 두 문자에 대해 커널에 의해 검사되고 " #! ", 나머지 행은 인터프리터의 경로와 첫 번째 인수로 사용됩니다. 즉, 커널은 실행 파일을 찾습니다. /bin/bash 첫 번째 인수로 스크립트의 이름을 전달하십시오. 이렇게 : /bin/bash ./test.sh.
이것은 정상적으로 일어날 것이며 당신 말이 맞습니다. 그것은 당신의 스크립트에 대해 동일한 효과를 가져야합니다. 하지만 스크립트에는 문제가 있습니다. 첫 번째 줄은 유닉스 줄 끝 (LF) 대신 DOS 줄 끝 (CR LF)으로 끝납니다. 인터프리터의 이름은 커널이 보듯이 /bin/bash^M 이것은 디스크에 존재하지 않습니다 (^ M은 행 끝나기 전에 거짓 CR을 나타냄). 설상가상으로 ^ M 문자는 대개 보이지 않습니다.
이것이 사실임을 증명할 수 있습니다. cat -v test.sh (보이지 않는 CR 문자에 대해 대체 ^ M을 인쇄합니다).
첫 번째 해결책은 "source"명령의 별명입니다.
그만큼 오두막 소스에 대한 #comment와 같이 간주됩니다.
스크립트를 호출 할 때 ./script, 쉘은 스크립트를 실행합니다. 오두막 #!/bin/bash
당신이 준 오류는 CRLF 문제로 보입니다. 다음과 같이 실행할 수 있습니다 :
dos2unix script.sh
Windows 최종 줄을 제거합니다.