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