Bash không tìm thấy một chương trình mặc dù nó trên con đường của tôi


26

Tôi có một chương trình trên con đường của tôi. Chương trình chạy khi được thực thi với một đường dẫn đầy đủ được chỉ định. Nhưng chương trình không thể được tìm thấy khi tôi chạy nó chỉ với tên của nó.

Về cơ bản, tôi muốn hiểu làm thế nào đầu ra dưới đây là có thể, và cách khắc phục nó để chương trình của tôi thực sự có thể được tìm thấy mà không có một đường dẫn đầy đủ được chỉ định:

root:/usr/local/bin# ./siege
****************************************************
siege: could not open /usr/local/bin/etc/siegerc
run 'siege.config' to generate a new .siegerc file
****************************************************
root:/usr/local/bin# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
root:/usr/local/bin# siege
bash: /usr/bin/siege: No such file or directory
root:/usr/local/bin# wtf!?!?

Tôi đang sử dụng Ubuntu 12.04. Ngoài ra, xin lưu ý rằng đầu ra cảnh báo từ cuộc bao vây không liên quan cho mục đích của câu hỏi này, vì tôi chỉ quan tâm đến việc chương trình có thể được tìm thấy và gọi hay không.

Câu trả lời:


38

Lưu ý đầu ra ở đây:

root:/usr/local/bin# siege
bash: /usr/bin/siege: No such file or directory

Bash duy trì một hàm băm nội bộ của các tệp thực thi được tìm thấy trước đó trong đường dẫn của bạn. Trong trường hợp này, nó có chi tiết rằng tại một thời điểm đã có một tệp thực thi tại / usr / bin / siege và sử dụng lại đường dẫn đó để tránh phải tìm kiếm lại. Bạn cần nói với bash để tự làm lại đường dẫn cho bao vây như vậy:

hash siege

Bạn cũng có thể xóa tất cả các vị trí băm:

hash -r

0

Một nguyên nhân khác của vấn đề này có thể là đường dẫn đến chính tệp thực thi nằm trên đường dẫn, thay vì thư mục chứa tệp thực thi .

Vì vậy, thay vì đặt

/home/myDir/theExecutable

trên đường dẫn, chỉ cần thêm điều này

/home/myDir
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.