#! / bin / bash-해당 파일 또는 디렉토리가 없습니다.

bash 스크립트를 만들었지 만 실행하려고하면

#!/bin/bash no such file or directory 

bash script.sh 명령을 실행해야 작동합니다.

어떻게 할 수 있습니까? 이 문제를 해결 하시겠습니까?

댓글

  • 이미 문제없이 실행 중이라고 맹세 할 수있는 스크립트가있는 cygwin에서이 문제가 발생했습니다. 모든 답변을 확인했습니다. 다른 질문과 답변도 32/64 비트 문제를 언급했지만 셸 스크립트의 경우 제외 할 수 있었죠?
  • 이유를 찾고 새로운 답변에 세부 정보를 추가했습니다. unix.stackexchange.com/a/450389/62636 (누군가가 #!/bin/bash

를 사용한 경우)

그리고 여기도 살펴 보겠습니다 …

답변

이러한 종류의 메시지는 일반적으로 가짜 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에서 스크립트를 작성하면 파일 시작 부분에 정크가 표시되는 경우가 있습니다.

코멘트

답변

사실 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>

  • 참. 그리고 언급했듯이 프로그램이 bash (또는 다른 인터프리터)를 찾을 수있는 훨씬 더 이식 가능한 / usr / bin / env 메소드가 있습니다. pah를 하드 코딩 할 필요가 없습니다.
  • 답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다