#! / bin / bash-파일이나 디렉토리가 없습니다


69

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

#!/bin/bash no such file or directory

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

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


맹세 할 수있는 스크립트로 cygwin 에서이 문제가 발생했습니다. 문제없이 이미 실행 중입니다. 나는 모든 대답을 확인했지만 아무도 맞지 않는 것 같습니다. 다른 질문과 답변에도 32/64 비트 문제가 언급되었지만 쉘 스크립트의 경우 제외 할 수 있습니까?
1 월

이유를 발견하고, 누군가가 대신 사용 하고 여기를보고 있는 경우를 대비 하여 새로운 anwer unix.stackexchange.com/a/450389/62636 에 세부 정보를 추가 했습니다.#!/usr/bin/env bash#!/bin/bash
jan

답변:


100

이러한 종류의 메시지는 일반적으로 첫 번째 줄 끝의 추가 캐리지 리턴 또는 시작 부분의 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

2
이것이 문제인지를 밝히는 또 다른 방법은입니다 hexdump -C yourscript | head -n 1. 여전히 dos2unix yourscript문제를 해결 하는 데 사용합니다.
Kevin M

그렇습니다. 나는 창문에서 편집했다. 팁을위한 것.
니콜라스 데 폰테나이

1
CRLF 문제인 경우 #!/bin/bash no such file or directory실행하거나 열려고 할 이유가 없으므로 오류 메시지가 표시 되지 않습니다 #!/bin/bash. 그것이 /bin/bash<CR>실행될 것입니다.
Stéphane Chazelas

1
@StephaneChazelas dos2unix가 문제를 해결 했으므로 CRLF 문제가 아니라는 의심은 거의 없습니다. 오류 메시지가 잘못 기록되었을 수 있습니다.
jlliagre

6
dos2unixUTF-8 BOM도 제거합니다. UTF-8 BOM이 오류 메시지를 설명했을 수 있습니다.
Stéphane Chazelas


9

사실, bash 스크립트에 대한 올바른 shebang은 다음과 같습니다.

#!/usr/bin/env bash

freeBSD에서 bash는 /usr/local/bin/bash


13
"올바른"은 그러한 경우에 사용하기 어려운 단어입니다. 아마도 더 나은 문구는 "오류가 적은 경향이있을 것입니다."
HalosGhost

1
이것 역시 끔찍합니다. / usr이 존재한다는 가정은 나쁜 IMO입니다. 예를 들어 Haiku에는 / usr이 없습니다.
jessicah

9

vi를 사용하여 두 가지 문제가 있으면이를 해결할 수 있습니다.

vi <your_file>
:set ff=unix
:set nobomb
:wq

답변은 가능한 한 많이 포함해야합니다. 이 질문에는 두 가지 문제가 언급되어 있지 않습니다. 다른 답변을 기반으로 할 경우 적어도 답변이 무엇인지 말해야합니다. 더 나은 방법으로, 이것이 어떻게 질문에 대답 하는지 설명해야합니다 .
G-Man

더 많은 Windows 도구를 다운로드하지 않고도 매우 빠르게 수정합니다. 감사합니다!
steampowered

1
@ G-Man 다른 답변은 이미 들어가고 싶은 것보다 훨씬 자세하게 언급하고 있습니다. 반복 할 필요는 없지만 고통스럽지 않으면 WIndows 줄 끝과 숨겨진 Windows BOM 문자를 사용할 수 있습니다. 나는 답변을 스캔하는 많은 사람들이 특히 다른 답변에 더 많은 세부 사항이있을 때 자립하는 대신 간결함을 좋아한다고 생각합니다.
cwash

4

dos2unix가없는 경우이 문제를 해결하는 방법입니다.

cp script _p4 && tr -d '\r' < _p4 > script && rm _p4

3

바이트 순서 마크 (BOM)

이것은 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

0

내가 실수로 잘못 bash는 실행 파일을 추가하여 문제를 가지고 있었다 PATH때문에 내 스크립트에보다 유연 #!/usr/bin/env bash오두막이 사용되었다 (경로에서 첫 bash는 실행을).

command -v bash
/cygdrive/c/Program Files/Git/bin//bash

cygwinWindows GIT GUI와 함께 작동하도록 Windows 용 GIT를 설치했습니다 (cygwin 기본 자식에서는 작동하지 않습니다 ...). #!/bin/bashsheband 로 전환하고 에서 Windows 용 GIT를 제거 하여이 문제를 해결했습니다 PATH.


-3

시험 #!/bin/bash

두 번째 : find / -name bash
세 번째 :ls -al /bin/bash


아니면 그냥 which bash. 우리는 그것이 일하고 있기 때문에 그것을 찾는 것을 알고 있습니다 bash script.sh.
Kevin

참된. 언급했듯이 프로그램이 bash (또는 다른 인터프리터)를 찾도록하는 훨씬 더 이식성이 뛰어난 / usr / bin / env 메소드가 있습니다. PAH를 하드 코딩 할 필요가 없습니다.
Hennes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.