#! / bin / bash - ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว


70

ฉันสร้างสคริปต์ทุบตี แต่เมื่อฉันพยายามเรียกใช้งานฉันจะได้รับ

#!/bin/bash no such file or directory

ฉันต้องการเรียกใช้คำสั่ง: bash script.shเพื่อให้สามารถใช้งานได้

ฉันจะแก้ไขสิ่งนี้ได้อย่างไร


ฉันมีปัญหานี้ในขณะนี้ภายใต้ cygwin ด้วยสคริปต์ฉันสามารถสาบานได้แล้วทำงานโดยไม่มีปัญหา ฉันตรวจสอบคำตอบทั้งหมดแล้ว แต่ดูเหมือนว่าไม่มีใครเหมาะสม คำถามและคำตอบอื่น ๆ ที่กล่าวถึงปัญหาบิต 32/64 แต่สำหรับเชลล์สคริปต์นี้สามารถยกเว้นได้ใช่ไหม
jan

พบเหตุผลเพิ่มรายละเอียดใน anwer ใหม่anix.stackexchange.com/a/450389/62636ในกรณีที่มีคนใช้#!/usr/bin/env bashแทน#!/bin/bashและดูที่นี่ ...
jan

คำตอบ:


100

ข้อความประเภทนี้มักเกิดจากสายปลอม shebang ไม่ว่าจะเป็นสายการบินพิเศษที่จะกลับมาที่จุดสิ้นสุดของบรรทัดแรกหรือ 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 tailing:

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

การเรียกใช้ตัวปลอมโดยการเรียกล่ามอย่างชัดเจนทำให้สคริปต์ 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

ใช่มันอาจเป็นไปได้ ฉันแก้ไขใน windows สิ่งที่เคล็ดลับ
Nicolas de Fontenay

1
ถ้ามันเป็นปัญหา CRLF คุณจะไม่เห็นข้อผิดพลาดในขณะที่ไม่มีอะไรเหตุผลที่จะพยายามที่จะดำเนินการหรือเปิด#!/bin/bash no such file or directory #!/bin/bashมันคือ/bin/bash<CR>สิ่งที่จะต้องถูกประหารชีวิต
Stéphane Chazelas

1
@StephaneChazelas เนื่องจาก dos2unix แก้ไขปัญหามีข้อสงสัยเล็กน้อยว่ามันไม่ใช่ปัญหา CRLF เกิดข้อผิดพลาดอาจจะเป็นเพียงแค่ Transcripted ไม่ถูกต้อง ..
jlliagre

6
dos2unixลบ UTF-8 BOM ด้วย UTF-8 BOM สามารถอธิบายข้อความแสดงข้อผิดพลาดได้
Stéphane Chazelas

17

สิ่งนี้อาจเกิดจาก BOM ในสคริปต์ UTF-8 หากคุณสร้างสคริปต์ใน Windows บางครั้งคุณจะได้รับขยะเมื่อเริ่มต้นไฟล์


BOM สามารถลบออกได้อย่างง่ายดายโดยใช้ awk เช่นเดียวกับstackoverflow.com/questions/1068650/…
pauxu

1
โปรดทราบว่า Visual Studio สำหรับ Mac จะแทรก BOM
ชัดเจนขึ้น

9

ที่จริงแล้ว shebang ที่เหมาะสมสำหรับสคริปต์ทุบตีคือ:

#!/usr/bin/env bash

เพราะใน freeBSD bash จะอยู่ที่ /usr/local/bin/bash


13
"ถูกต้อง" เป็นคำที่ใช้ยากในกรณีเช่นนี้ บางทีวลีที่ดีกว่าน่าจะเป็น "มีข้อผิดพลาดน้อยลง"
HalosGhost

1
นี่มันแย่มากเช่นกัน ข้อสันนิษฐานว่า / usr นั้นเป็น IMO ที่ไม่ดี ตัวอย่างเช่นไฮกุไม่มี / 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

Mark-order Mark (BOM)

นี่อาจเกิดจาก BOM จากวิกิพีเดีย BOM คือ

เครื่องหมายคำสั่งไบต์ (BOM) เป็นอักขระ Unicode, U + FEFF เครื่องหมายคำสั่งไบต์ (BOM) ซึ่งมีลักษณะเป็นเลขอาถรรพ์ที่จุดเริ่มต้นของสตรีมข้อความสามารถส่งสัญญาณหลายสิ่งไปยังโปรแกรมที่ใช้ข้อความ

น่าเสียดายที่มันไม่ได้ส่งสัญญาณอะไรไปยังเคอร์เนล Linux ที่จัดการกับสาย she-bang คุณสามารถตรวจสอบคุณมี BOM โดยใช้file,

file /tmp/foo 
/tmp/foo: UTF-8 Unicode (with BOM) text

หรือคุณสามารถ hexdump อักขระสองสามตัวแรกและดูว่าอักขระนั้นตรงกับอักขระ BOM ใด ๆ ด้วยตนเองหรือไม่

คุณสามารถตัดอักขระ BOM เมื่อคุณรู้จักพวกเขาเช่นนี้

sed -i '1 s/^\xef\xbb\xbf//' *.txt

0

ฉันมีปัญหาโดยบังเอิญเพิ่ม bash ที่ไม่ถูกต้องที่สามารถเรียกใช้งานได้PATHและเนื่องจากในสคริปต์ของฉันมีการใช้#!/usr/bin/env bashshebang ที่ยืดหยุ่นมากขึ้น(ใช้ bash executable แรกจากพา ธ )

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

ฉันได้ติดตั้ง GIT สำหรับ Windows เพื่อทำงานcygwinร่วมกับ Windows GIT GUIs (ไม่ได้ทำงานกับ cygwin native git ... ) ฉันจะแก้ไขในตอนนี้โดยสลับไป#!/bin/bashsheband และลบ GIT สำหรับ Windows PATHจาก


-3

ลอง #!/bin/bash

สิ่งที่สอง: find / -name bash
สิ่งที่สาม:ls -al /bin/bash


which bashหรือเป็นเพียงแค่ bash script.shเรารู้ว่ามันหาหนึ่งเพราะการทำงานร่วมกับ
Kevin

จริง และตามที่กล่าวไว้มีวิธีพกพา / usr / bin / env มากขึ้นเพื่อให้โปรแกรมค้นหา bash (หรือล่ามอื่น ๆ ) สำหรับคุณ ไม่จำเป็นต้อง hardcode a pah
Hennes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.