ฉันสร้างสคริปต์ทุบตี แต่เมื่อฉันพยายามเรียกใช้งานฉันจะได้รับ
#!/bin/bash no such file or directory
ฉันต้องการเรียกใช้คำสั่ง: bash script.sh
เพื่อให้สามารถใช้งานได้
ฉันจะแก้ไขสิ่งนี้ได้อย่างไร
#!/usr/bin/env bash
แทน#!/bin/bash
และดูที่นี่ ...
ฉันสร้างสคริปต์ทุบตี แต่เมื่อฉันพยายามเรียกใช้งานฉันจะได้รับ
#!/bin/bash no such file or directory
ฉันต้องการเรียกใช้คำสั่ง: bash script.sh
เพื่อให้สามารถใช้งานได้
ฉันจะแก้ไขสิ่งนี้ได้อย่างไร
#!/usr/bin/env bash
แทน#!/bin/bash
และดูที่นี่ ...
คำตอบ:
ข้อความประเภทนี้มักเกิดจากสายปลอม 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
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 สามารถอธิบายข้อความแสดงข้อผิดพลาดได้
สิ่งนี้อาจเกิดจาก BOM ในสคริปต์ UTF-8 หากคุณสร้างสคริปต์ใน Windows บางครั้งคุณจะได้รับขยะเมื่อเริ่มต้นไฟล์
ที่จริงแล้ว shebang ที่เหมาะสมสำหรับสคริปต์ทุบตีคือ:
#!/usr/bin/env bash
เพราะใน freeBSD bash จะอยู่ที่ /usr/local/bin/bash
คุณสามารถใช้ vi เพื่อแก้ไขปัญหาทั้งสองหากมี:
vi <your_file>
:set ff=unix
:set nobomb
:wq
หากคุณไม่มี dos2unix นี่เป็นวิธีแก้ไขปัญหานี้
cp script _p4 && tr -d '\r' < _p4 > script && rm _p4
นี่อาจเกิดจาก 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
ฉันมีปัญหาโดยบังเอิญเพิ่ม bash ที่ไม่ถูกต้องที่สามารถเรียกใช้งานได้PATH
และเนื่องจากในสคริปต์ของฉันมีการใช้#!/usr/bin/env bash
shebang ที่ยืดหยุ่นมากขึ้น(ใช้ bash executable แรกจากพา ธ )
command -v bash
/cygdrive/c/Program Files/Git/bin//bash
ฉันได้ติดตั้ง GIT สำหรับ Windows เพื่อทำงานcygwin
ร่วมกับ Windows GIT GUIs (ไม่ได้ทำงานกับ cygwin native git ... ) ฉันจะแก้ไขในตอนนี้โดยสลับไป#!/bin/bash
sheband และลบ GIT สำหรับ Windows PATH
จาก
ลอง #!/bin/bash
สิ่งที่สอง: find / -name bash
สิ่งที่สาม:ls -al /bin/bash
which bash
หรือเป็นเพียงแค่ bash script.sh
เรารู้ว่ามันหาหนึ่งเพราะการทำงานร่วมกับ