88

Mỗi lần tôi chạy tập lệnh bằng cách sử dụng bash scriptname.shtừ dòng lệnh trong Debian, tôi nhận được Command Not foundvà sau đó là kết quả của tập lệnh. Vì vậy, kịch bản hoạt động nhưng luôn có một Command Not Foundtuyên bố được in trên màn hình.

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

CẬP NHẬT - vấn đề xuất hiện với các 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 sao điều này sẽ xảy ra?

|
143

Hãy chắc chắn rằng dòng đầu tiên của bạn là:

#!/bin/bash

Nhập đường dẫn của bạn đến bash nếu không /bin/bash


Hãy thử chạy:

dos2unix script.sh

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

Thêm chi tiết về dos2unixlệnh (trang man)


Một cách khác để biết liệu 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ẽ trông giống như thế này:

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

Điều này sẽ xuất ra toàn bộ văn bản tệp <CR>được hiển thị cho mỗi \rký tự trong tệp.

|
49

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

|
37

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 làm một ls -l, bạn có thể xác định rằng tệp của bạn có thể KHÔNG 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

|
10

Nếu kịch bản 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ó lẽ là một dòng duy nhất trong tệp tham chiếu chương trình không nằm trên đường dẫn, không được cài đặt, sai chính tả hoặc một cái gì đó tương tự.

Một cách là đặt một set -xphần trên cùng của 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 hiện chúng và bạn thường chỉ cần nhìn vào đầu ra lệnh ngay trước khi xảy ra lỗi để xem điều gì gây ra sự cố

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

od -xcb testscript.sh

và đảm bảo rằng không có các ký tự vui "vô hình" như CTRL-M(trả lại xe ngựa) mà bạn có thể nhận được bằng cách sử dụng trình chỉnh sửa kiểu Windows.

|
7

sử dụng dos2unixtrên tập tin kịch bản của bạn.

|
6

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

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

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

VAR_NAME=$(hostname)
|
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, chuyển đến 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 tin 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.

|
  • 1

    Cám ơn vì cái này. Đối với trường hợp của tôi, tôi đã chạy tập lệnh trên distro linux linux. 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 / other. thay đổi EOL trong Notepad ++ thành Unix đã sửa nó.

    – Hoàng Minh Nguyệt 02:04:11 07/09/2017
5

để thực hiện rằng bạn phải cung cấp đầy đủ đường dẫn đó

/home/Manuel/mywrittenscript
|
  • 1

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

    – Hoàng Minh Nguyệt 20:13:00 31/07/2016
  • 1

    tất nhiên .in hệ thống tệp linux trái với các phần mở rộng của 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 được nói trong trường hợp của tôi .

    – Bùi Quốc Thông 10:05:17 01/08/2016
5

Thử chmod u+x testscript.sh

Tôi biết nó từ đây: http://www.linuxquestions.org/questions/red-hat-31/rucky-shell-script-command-not-found-202062/

|
3

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

Trên Bash cho Windows, tôi đã thử chạy sai

run_me.sh 

không có ./ lúc đầu và có cùng một lỗi.

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

./run_me.sh
|
2

Các vấn đề với các tập lệnh đang chạy cũng có thể được kết nối với định dạng xấu 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 khi ngắt dòng "\". Ví dụ:

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

(vui lòng lưu ý thêm không gian 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 đã chạy vào đây hôm nay, vô tình sao chép dấu nhắc lệnh đô la $(trước một chuỗi lệnh) vào tập lệnh.

|
0

Thêm thư mục hiện tại (.) Vào PATH để có thể thực thi 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
|
0

Tôi cũng đã có một số Cannot execute command. Mọi thứ đều có vẻ chính xác, nhưng thực tế tôi đang có một không gian không thể phá vỡ &nbsp;ngay trước khi mệnh lệnh của tôi không thể nhận ra 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 sự cố.

|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.