bash 스크립트를 만들었지 만 실행하려고하면
#!/bin/bash no such file or directory
bash script.sh
명령을 실행해야 작동합니다.
어떻게 할 수 있습니까? 이 문제를 해결 하시겠습니까?
댓글
를 사용한 경우)
그리고 여기도 살펴 보겠습니다 …
답변
이러한 종류의 메시지는 일반적으로 가짜 shebang 줄, 전나무 끝에 추가 캐리지 리턴 시작 부분에 st 줄 또는 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
) 및 다음과 같은 각 shebang 줄이 있습니다.
correctScript :
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
보 실행 인터프리터를 명시 적으로 호출하여 gus를 사용하면 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
를 사용하여 수정합니다. - CRLF 문제인 경우 '
#!/bin/bash no such file or directory
오류 메시지. ' 아무것도 실행하거나 열려고 할 이유가 없습니다.#!/bin/bash
. '의/bin/bash<CR>
실행됩니다. - @StephaneChazelas dos2unix가 문제를 해결 했으므로 의심의 여지가 없습니다. ' CRLF 문제가 아닙니다. 오류 메시지가 잘못 기록되었을 수 있습니다.
-
dos2unix
도 UTF-8 BOM을 제거합니다. UTF-8 BOM이 오류 메시지를 설명했을 수 있습니다. - Microsoft가 얼마나 호환되지 않는지 안타깝습니다. ASCII와 같은 기본적인 것에서도 마찬가지입니다.
Answer
이는 UTF 형식의 BOM으로 인해 발생할 수도 있습니다. -8 스크립트. Windows에서 스크립트를 작성하면 파일 시작 부분에 정크가 표시되는 경우가 있습니다.
코멘트
- BOM은 awk를 사용하여 쉽게 제거 할 수 있습니다. stackoverflow.com/questions/1068650/ …
- Visual Studio for Mac이 BOM을 삽입합니다.
답변
사실 bash 스크립트에 적합한 shebang은 다음과 같습니다.
p>
#!/usr/bin/env bash
왜냐하면 freeBSD에서 bash는 /usr/local/bin/bash
댓글
에 있기 때문입니다.
- " right "는 이러한 경우 사용하기 어려운 단어입니다. 아마도 더 나은 표현은 " 오류 발생 가능성이 적은 " 일 것입니다.
- 이 역시 끔찍합니다. / usr이 존재한다는 가정은 잘못된 IMO입니다. 예를 들어, Haiku에는 / usr이 없습니다.
답변
vi를 사용하여 두 문제를 모두 해결할 수 있습니다. 존재하는 경우 :
vi <your_file> :set ff=unix :set nobomb :wq
댓글
- 답변은 가능한 한 독립적이어야합니다. 질문은 두 가지 문제를 언급하지 않습니다. 다른 답변을 바탕으로 작성하려면 적어도 답변이 무엇인지 말해야합니다. 더 나은 방법은 어떻게 질문에 대한 대답인지 설명해야합니다.
- 더 많은 Windows 도구를 다운로드하지 않고도 매우 빠르게 수정합니다. 감사합니다!
- @ G-Man 기타 답변 이미 제가 들어가고 싶은 것보다 훨씬 더 자세히 언급했습니다.반복 할 필요는 없지만 ' 명확하지 않은 경우 WIndows 줄 끝과 숨겨진 Windows BOM 문자가있을 수 있습니다. 특히 다른 답변에 훨씬 더 자세한 내용이있을 때 답변을 스캔하는 많은 사람들이 스스로 포함하는 대신 간결성을 높이 평가한다고 생각합니다.
Answer
dos2unix가없는 경우이 문제를 해결할 수 있습니다.
cp script _p4 && tr -d "\r" < _p4 > script && rm _p4
답변
BOM (바이트 순서 표시)
이 원인은 다음과 같습니다. Wikipedia에서 BOM은 다음과 같습니다.
BOM (바이트 순서 표시)은 유니 코드 문자, U + FEFF BOM (바이트 순서 표시)입니다. , 텍스트 스트림의 시작 부분에 매직 넘버로 표시되면 텍스트를 사용하는 프로그램에 여러 가지 신호를 보낼 수 있습니다.
안타깝게도 쉬뱅 라인을 처리하는 Linux 커널에 신호를 보내지 않습니다. file
를 사용하여 BOM이 있는지 확인할 수 있습니다. ,
file /tmp/foo /tmp/foo: UTF-8 Unicode (with BOM) text
또는 hexdump를 사용할 수 있습니다. 처음 몇 개의 문자를 확인하고 수동으로 BOM 문자와 일치하는 경우
이렇게 알게되면 BOM 문자를 제거 할 수 있습니다. ,
sed -i "1 s/^\xef\xbb\xbf//" *.txt
답변
실수로 잘못된 bash를 추가하여 문제가 발생했습니다. PATH
에 실행 가능하고 스크립트에서 더 유연한 #!/usr/bin/env bash
shebang이 사용 되었기 때문입니다 (경로에서 첫 번째 bash 실행 파일 가져 오기).
command -v bash /cygdrive/c/Program Files/Git/bin//bash
Windows GIT GUI와 함께 cygwin
에서 작동하도록 Windows 용 GIT를 설치했습니다 (cygwin 기본 git에서 작동하지 않음). …). 이제 #!/bin/bash
sheband로 전환하고 PATH
에서 Windows 용 GIT를 제거하여이 문제를 해결했습니다.
답변
#!/bin/bash
두 번째 작업 : find / -name bash
세 번째 : ls -al /bin/bash
댓글
- 또는
which bash
. ' '가bash script.sh
와 작업하기 때문에 ' 하나를 찾는다는 것을 알고 있습니다.
li>
#!/bin/bash