bash 스크립트를 만들었지 만 실행하려고 할 때
#!/bin/bash no such file or directory
명령을 실행해야 bash script.sh
작동합니다.
이 문제를 어떻게 해결할 수 있습니까?
#!/usr/bin/env bash
#!/bin/bash
bash 스크립트를 만들었지 만 실행하려고 할 때
#!/bin/bash no such file or directory
명령을 실행해야 bash script.sh
작동합니다.
이 문제를 어떻게 해결할 수 있습니까?
#!/usr/bin/env bash
#!/bin/bash
답변:
이러한 종류의 메시지는 일반적으로 첫 번째 줄 끝의 추가 캐리지 리턴 또는 시작 부분의 BOM 인 가짜 세방 라인 때문입니다.
운영:
$ head -1 yourscript | od -c
어떻게 끝나는 지 봅니다.
이것은 틀렸다 :
0000000 # ! / b i n / b a s h \r \n
이것도 잘못되었습니다.
0000000 357 273 277 # ! / b i n / b a s h \n
이것은 맞습니다 :
0000000 # ! / b i n / b a s h \n
사용 dos2unix
(또는 sed
, tr
, awk
, perl
, python
이 문제의 경우 스크립트를 해결하기 위해 ...).
다음은 BOM과 테일링 CR을 모두 제거하는 것입니다.
sed -i '1s/^.*#//;s/\r$//' brokenScript
다음은 이름 ( echo $0
)을 표시하고 다음과 같은 세방 문자가있는 세 개의 스크립트입니다 .
올바른 스크립트 :
0000000 # ! / b i n / b a s h \n
scriptWithBom :
0000000 357 273 277 # ! / b i n / b a s h \n
scriptWithCRLF :
0000000 # ! / b i n / b a s h \r \n
bash에서 실행하면 다음 메시지가 표시됩니다.
$ ./correctScript
./correctScript
$ ./scriptWithCRLF
bash: ./scriptWithCRLF: /bin/bash^M: bad interpreter: No such file or directory
$ ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom
명시 적으로 인터프리터를 호출하여 가짜 스크립트를 실행하면 CRLF 스크립트를 아무런 문제없이 실행할 수 있습니다.
$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom
아래에서 관찰되는 동작은 다음과 같습니다 ksh
.
$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom
그리고 아래에 dash
:
$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom
hexdump -C yourscript | head -n 1
. 여전히 dos2unix yourscript
문제를 해결 하는 데 사용합니다.
#!/bin/bash no such file or directory
실행하거나 열려고 할 이유가 없으므로 오류 메시지가 표시 되지 않습니다 #!/bin/bash
. 그것이 /bin/bash<CR>
실행될 것입니다.
dos2unix
UTF-8 BOM도 제거합니다. UTF-8 BOM이 오류 메시지를 설명했을 수 있습니다.
UTF-8 스크립트의 BOM으로 인해 발생할 수도 있습니다. Windows에서 스크립트를 작성하면 파일 시작 부분에 정크가 생길 수 있습니다.
사실, bash 스크립트에 대한 올바른 shebang은 다음과 같습니다.
#!/usr/bin/env bash
freeBSD에서 bash는 /usr/local/bin/bash
vi를 사용하여 두 가지 문제가 있으면이를 해결할 수 있습니다.
vi <your_file>
:set ff=unix
:set nobomb
:wq
이것은 BOM으로 인해 발생할 수 있습니다. Wikipedia에서 BOM은
바이트 순서 표시 (BOM)는 유니 코드 문자 U + FEFF 바이트 순서 표시 (BOM)이며, 텍스트 스트림 시작시 마법 번호로 표시되면 텍스트를 소비하는 프로그램에 여러 가지 신호를 보낼 수 있습니다.
불행히도, she-bang 라인을 처리하는 Linux 커널에는 아무것도 알리지 않습니다. 당신은을 사용하여 당신은 BOM을 확인할 수 있습니다 file
,
file /tmp/foo
/tmp/foo: UTF-8 Unicode (with BOM) text
또는 처음 몇 문자를 16 진수 덤프 하여 BOM 문자와 수동으로 일치하는지 확인할 수 있습니다.
BOM 문자를 알고 있으면 BOM 문자를 제거 할 수 있습니다.
sed -i '1 s/^\xef\xbb\xbf//' *.txt
내가 실수로 잘못 bash는 실행 파일을 추가하여 문제를 가지고 있었다 PATH
때문에 내 스크립트에보다 유연 #!/usr/bin/env bash
오두막이 사용되었다 (경로에서 첫 bash는 실행을).
command -v bash
/cygdrive/c/Program Files/Git/bin//bash
cygwin
Windows GIT GUI와 함께 작동하도록 Windows 용 GIT를 설치했습니다 (cygwin 기본 자식에서는 작동하지 않습니다 ...). #!/bin/bash
sheband 로 전환하고 에서 Windows 용 GIT를 제거 하여이 문제를 해결했습니다 PATH
.