#! / bin / bash - không có tệp hoặc thư mục như vậy


70

Tôi đã tạo một tập lệnh bash nhưng khi tôi cố gắng thực thi nó, tôi nhận được

#!/bin/bash no such file or directory

Tôi cần chạy lệnh: bash script.shđể nó hoạt động.

Làm thế nào tôi có thể sửa lỗi này?


Bây giờ tôi có vấn đề này dưới cygwin với một kịch bản mà tôi có thể thề là đã chạy mà không gặp vấn đề gì. Tôi đã kiểm tra tất cả các câu trả lời, nhưng dường như không có gì phù hợp. Các câu hỏi và câu trả lời khác cũng đề cập đến các vấn đề 32/64 bit, nhưng đối với các kịch bản shell thì điều này có thể được loại trừ, phải không?
Tháng Một

Tìm thấy lý do, thêm chi tiết trong anwer unix.stackexchange.com/a/450389/62636 trong trường hợp ai đó cũng đã sử dụng #!/usr/bin/env bashthay vì #!/bin/bashvà cũng đang tìm kiếm ở đây ...
jan

Câu trả lời:


100

Loại tin nhắn này thường là do một dòng shebang không có thật, hoặc là một sự trở lại vận chuyển thêm ở cuối dòng đầu tiên hoặc BOM ở đầu của nó.

Chạy:

$ head -1 yourscript | od -c

và xem nó kết thúc như thế nào

Cái này sai:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

Điều này cũng sai:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

Chính xác:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

Sử dụng dos2unix(hoặc sed, tr, awk, perl, python...) để sửa chữa kịch bản của bạn nếu điều này là vấn đề.

Đây là một cái sẽ loại bỏ cả BOM và CR đuôi:

sed -i '1s/^.*#//;s/\r$//' brokenScript


Lưu ý rằng trình bao bạn đang sử dụng để chạy tập lệnh sẽ ảnh hưởng một chút đến các thông báo lỗi được hiển thị.

Dưới đây là ba tập lệnh chỉ hiển thị tên của chúng ( echo $0) và có các dòng shebang tương ứng sau:

đúng:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithBom:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

tập lệnhWithCRLF:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

Trong bash, chạy chúng sẽ hiển thị các thông báo sau:

$ ./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

Chạy những cái không có thật bằng cách gọi một cách rõ ràng trình thông dịch cho phép tập lệnh CRLF chạy mà không gặp vấn đề gì:

$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

Đây là hành vi được quan sát dưới kshđây:

$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom

và dưới dash:

$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom

2
Một cách khác để tiết lộ nếu đây là vấn đề hexdump -C yourscript | head -n 1. Tôi vẫn sẽ sử dụng dos2unix yourscriptđể sửa chữa nó.
Kevin M

Vâng, nó rất có thể là như vậy. Tôi chỉnh sửa trên windows. Những điều cho tiền boa.
Nicolas de Fontenay

1
Nếu đó là sự cố CRLF, bạn sẽ không thấy #!/bin/bash no such file or directorythông báo lỗi, vì không có lý do gì để cố thực thi hoặc mở #!/bin/bash. Đó là /bin/bash<CR>những gì sẽ được thực hiện.
Stéphane Chazelas

1
@StephaneChazelas Vì dos2unix đã khắc phục sự cố, không có nghi ngờ gì, đó không phải là sự cố CRLF. Thông báo lỗi có lẽ chỉ được sao chép không chính xác ..
jlliagre

6
dos2unixcũng loại bỏ BOM UTF-8. Một BOM UTF-8 có thể đã giải thích thông báo lỗi.
Stéphane Chazelas

17

Điều này cũng có thể do BOM gây ra trong tập lệnh UTF-8. Nếu bạn tạo tập lệnh trong Windows, đôi khi bạn nhận được một số rác khi bắt đầu tệp.


BOM có thể được gỡ bỏ dễ dàng bằng cách sử dụng awk, như trong stackoverflow.com/questions/1068650/ory
pauxu

1
Lưu ý rằng Visual Studio cho Mac sẽ chèn BOM.
Rõ ràng hơn

9

Thực tế, shebang đúng cho kịch bản bash là đây:

#!/usr/bin/env bash

Bởi vì, trong freeBSD, bash nằm ở /usr/local/bin/bash


13
"đúng" là một từ khó sử dụng trong những trường hợp như vậy. Có lẽ một cụm từ tốt hơn sẽ là "ít lỗi hơn".
HalosGhost

1
Điều này cũng thật tồi tệ; giả định rằng / usr tồn tại là một IMO xấu. Haiku, ví dụ, không có / usr.
jessicah

9

Bạn có thể sử dụng vi để sửa cả hai vấn đề nếu chúng tồn tại:

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

Câu trả lời nên được khép kín càng nhiều càng tốt. Câu hỏi không đề cập đến hai vấn đề; nếu bạn định xây dựng các câu trả lời khác, ít nhất bạn nên nói chúng là gì. Tốt hơn nữa, bạn nên giải thích làm thế nào điều này trả lời câu hỏi.
G-Man

Sửa rất nhanh mà không cần tải thêm công cụ windows, cảm ơn!
steampowered

1
@ G-Man Các câu trả lời khác đã đề cập đến vấn đề này chi tiết hơn nhiều so với tôi muốn đi vào. Không cần phải lặp lại, nhưng nếu nó không quá rõ ràng, bạn có thể có một dòng kết thúc WIndows và một ký tự Windows BOM ẩn. Tôi nghĩ rằng rất nhiều người đang quét các câu trả lời đánh giá cao sự ngắn gọn thay vì khép kín, đặc biệt là khi có nhiều chi tiết hơn trong các câu trả lời khác.
cwash

4

Nếu bạn không có dos2unix thì đây là cách khắc phục vấn đề này.

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

3

Dấu hiệu đơn hàng (BOM)

Điều này có thể được gây ra bởi một BOM. Từ Wikipedia, BOM là một

Dấu thứ tự byte (BOM) là một ký tự Unicode, dấu thứ tự byte U + FEFF (BOM), có vẻ như là một số ma thuật khi bắt đầu một luồng văn bản có thể báo hiệu một số điều cho một chương trình tiêu thụ văn bản

Thật không may, nó không báo hiệu bất cứ điều gì đến nhân Linux xử lý dòng she-bang. Bạn có thể xác minh rằng bạn có BOM bằng cách sử dụng file,

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

Hoặc bạn có thể hexdump một vài ký tự đầu tiên và xem liệu chúng có khớp với bất kỳ ký tự BOM nào theo cách thủ công không

Bạn có thể loại bỏ các ký tự BOM khi bạn biết chúng như thế này,

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

0

Tôi đã gặp vấn đề khi vô tình thêm một bash sai thực thi vào PATHvà bởi vì trong kịch bản của tôi, #!/usr/bin/env bashshebang linh hoạt hơn đã được sử dụng (lấy bash thực thi đầu tiên từ đường dẫn).

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

Tôi đã cài đặt GIT cho Windows để hoạt động cygwincùng với GUI GIT của Windows (không hoạt động với git bản địa của Cygwin ...). Tôi đã giải quyết vấn đề này bằng cách chuyển sang #!/bin/bashsheband và xóa GIT cho windows PATH.


-3

Thử #!/bin/bash

Điều thứ hai: find / -name bash
Điều thứ ba:ls -al /bin/bash


Hoặc chỉ which bash. Chúng tôi biết nó đang tìm một vì nó hợp tác bash script.sh.
Kevin

Thật. Và như đã đề cập, có một phương thức di động / usr / bin / env di động hơn nhiều để có một chương trình định vị bash (hoặc một trình thông dịch khác) cho bạn. Không cần hardcode một pah.
Hennes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.