Tập lệnh Bash in “Command Not Found” trên các dòng trống


111

Mỗi khi tôi chạy một tập lệnh bằng bash scriptname.shdòng lệnh trong Debian, tôi nhận được Command Not foundvà sau đó là kết quả của tập lệnh.

Tập lệnh hoạt động nhưng luôn có một Command Not Foundcâu lệnh được in trên màn hình cho mỗi dòng trống. Mỗi dòng trống dẫn đến một lệnh không được tìm thấy.

Tôi đang chạy tập lệnh từ /varthư mục.

Đây là kịch bản:

#!/bin/bash

echo Hello World

Tôi chạy nó bằng cách gõ như sau:

bash testscript.sh

Tại sao điều này xảy ra?


Nghiêm túc mà nói, mạng đầy rẫy những lời phàn nàn như vậy. Shell rất yếu và thông dịch viên khập khiễng. Ít ở đây và ở đó và nó không thành công. Bạn phải xem thậm chí tất cả các khoảng trắng trong kịch bản. Tập lệnh của tôi không thành công do ký tự nguồn cấp dòng ẩn. Có lẽ đây chỉ là ngôn ngữ kịch bản mà số lượng khoảng trắng quan trọng!
Atul

1
Sử dụng bash -x scriptname.shđể theo dõi lỗi. - Trong trường hợp của tôi, đó là một tệp sh được lưu trong Windows với VSCode và kết thúc dòng là "CRLF". Trong VSCode ở góc dưới cùng bên phải, bạn có thể thay đổi dấu kết thúc dòng từ "CRLF" thành "LF". Đã tải lên tệp này và cuối cùng có thể thực thi nó với bash scriptname.sh.
Kai Noack

Đây chắc chắn là một bản sao của stackoverflow.com/questions/39527571/… nhưng nhiều câu trả lời ở đây giải thích một số trường hợp khác mà bạn nhận được "lệnh không tìm thấy" vì các lý do khác. Khách truy cập nên đọc tất cả các câu trả lời nếu vấn đề của bạn không cụ thể về các dòng trống.
tripleee

Câu trả lời:


161

Đảm bảo dòng đầu tiên của bạn là:

#!/bin/bash

Nhập đường dẫn của bạn để bash nếu nó không phải là /bin/bash


Thử chạy:

dos2unix script.sh

Điều đó sẽ chuyển đổi kết thúc dòng, v.v. từ Windows sang định dạng unix. tức là nó tách \ r (CR) khỏi các phần cuối của dòng để thay đổi chúng từ \r\n (CR+LF)thành \n (LF).

Thêm chi tiết về dos2unixlệnh (trang người đàn ông)


Một cách khác để biết tệp của bạn có ở định dạng dos / Win hay không:

cat scriptname.sh | sed 's/\r/<CR>/'

Đầu ra sẽ giống như sau:

#!/bin/sh<CR>
<CR>
echo Hello World<CR>
<CR>

Thao tác này sẽ xuất ra toàn bộ văn bản tệp với <CR>hiển thị cho từng \rký tự trong tệp.


Điều đó có lẽ không cần thiết vì anh ấy đang chạy nó trực tiếp với bash scriptname.sh(nhưng tất nhiên đó vẫn là phương pháp tốt).
paxdiablo 09/09

1
! Hi # / bin / bash là dòng đầu tiên của kịch bản của tôi
David

1
@chown - Tôi gặp sự cố tương tự trên Mac. Tôi tình cờ đọc được bài viết này. Tôi không chắc liệu nó có giúp OP hay không. Nhưng giải pháp của bạn đã giúp tôi.
Prashant

1
cảm ơn. Đây chính xác là vấn đề mà tôi đang phải đối mặt. Câu trả lời này làm cho nó hoạt động.
slayedbylucifer

5
Làm thế nào bạn có thể viết câu trả lời cho một câu hỏi lập trình trong khi lái xe?
Omar Tariq

61

Bạn có thể sử dụng bash -x scriptname.shđể theo dõi nó.


47

Tôi cũng gặp phải một vấn đề tương tự. Vấn đề dường như là quyền. Nếu bạn thực hiện một ls -l, bạn có thể xác định rằng tệp của bạn có thể KHÔNG được bật bit thực thi. Điều này sẽ KHÔNG cho phép tập lệnh thực thi. :)

Như @artooro đã thêm vào bình luận:

Để khắc phục sự cố đó, hãy chạy chmod +x testscript.sh


4
Để khắc phục sự cố đó, hãy chạychmod +x testscript.sh
artooro

Đây là câu trả lời phù hợp với tôi, Luôn luôn được thông báo rằng tôi không được phép, vì vậy tôi đã làm nó và được thông báo là không tìm thấy lệnh. Tôi đã không nghĩ để kiểm tra các quyền.
DiamondDrake

1
Cảm ơn Lypso345, điều này đã giải quyết được vấn đề tôi đang gặp phải.
ammills 01

chmod 777
testscript.sh

16

Điều này có thể là tầm thường và không liên quan đến câu hỏi của OP, nhưng tôi thường nhầm lẫn điều này ngay từ đầu khi tôi học viết kịch bản

VAR_NAME = $(hostname)
echo "the hostname is ${VAR_NAME}"  

Điều này sẽ tạo ra phản hồi 'không tìm thấy lệnh'. Cách đúng là loại bỏ các khoảng trắng

VAR_NAME=$(hostname)

11

Nếu tập lệnh thực hiện công việc của nó (tương đối) tốt, thì nó sẽ chạy ổn. Vấn đề của bạn có thể là một dòng duy nhất trong tệp tham chiếu đến một chương trình không có trên đường dẫn, chưa được cài đặt, viết sai chính tả hoặc thứ gì đó tương tự.

Một cách là đặt một set -xở đầu tập lệnh của bạn hoặc chạy nó bash -xthay vì chỉ bash- điều này sẽ xuất ra các dòng trước khi thực thi chúng và bạn thường chỉ cần xem đầu ra lệnh ngay lập tức trước khi có lỗi để xem điều gì gây ra sự cố

Nếu, như bạn nói, đó là các dòng trống gây ra sự cố, bạn có thể muốn kiểm tra thực tế những gì trong đó. Chạy:

od -xcb testscript.sh

và đảm bảo rằng không có ký tự hài hước "vô hình" như CTRL-M( ký tự xuống dòng ) mà bạn có thể nhận được bằng cách sử dụng trình soạn thảo loại Windows.


+1 cho lệnh 'od'! Thật tuyệt, tôi không biết về điều đó! Cảm ơn!
chown

11

Trên Bash cho Windows, tôi đã thử chạy không chính xác

run_me.sh 

không có ./ ở đầu và bị lỗi tương tự.

Đối với những người có nền Windows, biểu mẫu chính xác có vẻ thừa:

./run_me.sh



6

để thực hiện, bạn phải cung cấp đường dẫn đầy đủ, ví dụ:

/home/Manuel/mywrittenscript

Thật vậy, shell không quan tâm đến phần mở rộng tệp. Không chắc chắn điều này xứng đáng được đăng như một câu trả lời riêng biệt.
tripleee

tất nhiên, hệ thống tệp .in linux trái ngược với các phần mở rộng windows chỉ được sử dụng như một phần của tên và không nói gì về nội dung của tệp. Tôi không phải nói trong trường hợp hạn chế của tôi .
Masood Moghini,

6

Nếu bạn có Notepad ++ và bạn nhận được Thông báo Lỗi .sh này: "không tìm thấy lệnh" hoặc Thông báo Lỗi autoconf này "dòng 615: ../../autoconf/bin/autom4te: Không có tệp hoặc thư mục như vậy" .

Trên Notepad ++ của bạn, đi tới Chỉnh sửa -> Chuyển đổi EOL, sau đó kiểm tra Macinthos (CR) . Điều này sẽ chỉnh sửa các tệp của bạn. Tôi cũng khuyến khích kiểm tra tất cả các tệp bằng lệnh này, vì sẽ sớm xảy ra lỗi như vậy.


Cảm ơn vì điều đó. Đối với trường hợp của tôi, tôi đang chạy tập lệnh trên bản phân phối linux của busybox. Có cùng một lỗi "không tìm thấy" trong tất cả các dòng trống trong tập lệnh của tôi. nó cũng có vấn đề với câu lệnh if / else. thay đổi EOL trong Notepad ++ thành Unix đã khắc phục sự cố.
GeneCode,

4

Có cùng một vấn đề. không may

dos2unix winfile.sh
bash: dos2unix: command not found

vì vậy tôi đã làm điều này để chuyển đổi.

 awk '{ sub("\r$", ""); print }' winfile.sh > unixfile.sh

và sau đó

bash unixfile.sh

2

Các vấn đề với tập lệnh đang chạy cũng có thể liên quan đến định dạng sai của các lệnh nhiều dòng, ví dụ: nếu bạn có một ký tự khoảng trắng sau dấu ngắt dòng "\". Ví dụ:

./run_me.sh \ 
--with-some parameter

(xin lưu ý rằng khoảng trống thừa sau "\") sẽ gây ra sự cố, nhưng khi bạn xóa khoảng trắng đó, nó sẽ chạy hoàn toàn tốt.


0

Tôi cũng đã có một số Cannot execute command. Mọi thứ đều có vẻ đúng, nhưng thực tế là tôi đang có một khoảng trống không thể phá vỡ &nbsp;ngay trước lệnh của tôi, điều tất nhiên là không thể phát hiện bằng mắt thường:

if [[ "true" ]]; then
  &nbsp;highlight --syntax js "var i = 0;"
fi

Mà, trong Vim, trông giống như:

if [[ "true" ]]; then
  highlight --syntax js "var i = 0;"
fi

Chỉ sau khi chạy trình kiểm tra tập lệnh Bash, shellchecktôi mới tìm thấy vấn đề.


shellcheckcó sẵn trực tuyến, mặc dù tất nhiên bạn cần phải sao chép + dán chính xác tập lệnh của mình để điều đó có ích. shellcheck.net
tripleee

0

Tôi gặp phải điều này hôm nay, do lơ đãng sao chép dấu nhắc lệnh đô la $(trước chuỗi lệnh) vào tập lệnh.


-1

Thêm thư mục hiện tại (.) Vào PATH để có thể thực thi một tập lệnh, chỉ bằng cách nhập tên của nó, nằm trong thư mục hiện tại:

PATH=.:$PATH

1
Đây được coi là một lỗ hổng bảo mật. KHÔNG THÊM .VÀO PATH CỦA BẠN.
gniourf_gniourf

Giải thích về lý do tại sao "câu trả lời" này là một ý tưởng tồi: superuser.com/questions/156582/…
jmng,

-1

Bạn có thể muốn cập nhật các tệp .bashrc và .bash_profile với bí danh để nhận dạng lệnh bạn đang nhập.

Các tệp .bashrc và .bash_profile là các tệp ẩn có thể nằm trên ổ C: nơi bạn lưu các tệp chương trình của mình.

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.