Thông báo lỗi 'nguồn: không tìm thấy' khi chạy tập lệnh


35

Tôi đang tạo một tập lệnh thiết lập tự động nhỏ sẽ sửa đổi /etc/profile$HOME/.profilenếu một số đường dẫn không được xuất. Sau đó, tôi muốn tải lại chúng tự động.

Tôi đã đọc được điều sourcenày, vì vậy tôi đã kích hoạt thiết bị đầu cuối của mình và nhập:

source /etc/profile
source ~/.profile

Từ thiết bị đầu cuối, nó không xuất ra bất kỳ lỗi nào.

Tuy nhiên, việc đặt hai lệnh này bên trong tập lệnh Bash sẽ dẫn đến kết quả source: not found.

  1. Làm thế nào tôi có thể chắc chắn rằng tập lệnh được Bash thực thi, ngay cả khi #!/bin/shđược chỉ định (rõ ràng, nó không đảm bảo nó)?
  2. Tại sao nó nói rằng hai nguồn này không thể được tìm thấy khi chúng không thể nhầm lẫn ở đó?

Câu trả lời:


54

/bin/shkhông phải là bash. Để thực thi tập lệnh của bạn bash, hãy viết #!/bin/bashdưới dạng dòng đầu tiên trong tập lệnh của bạn.

Lỗi source: not foundkhông được bỏ, vì /etc/profilekhông tìm thấy. Nó bị rơi, vì sourcekhông tìm thấy. sourcelà một hàm dựng sẵn của Bash và bạn không thực thi tập lệnh với bash. Vì vậy, rõ ràng tại sao nó không được tìm thấy. Thay đổi #!dòng trong kịch bản, và nó sẽ hoạt động.


9

1. Làm thế nào tôi có thể chắc chắn rằng tập lệnh được Bash thực thi, ngay cả khi #!/bin/shđược chỉ định (rõ ràng, nó không đảm bảo nó)?

Để chắc chắn rằng tập lệnh được viết cho shshell (như trong trường hợp của bạn - hãy xem Sự khác biệt giữa #! / Bin / sh và #! / Bin / bash? ) Được thực thi bởi Bash, chỉ cần chạy lệnh sau:

bash script_name

Do đó, bạn sẽ không nhận được lỗi đó nữa.

2. Tại sao nó nói rằng hai nguồn này không thể được tìm thấy khi chúng không thể nhầm lẫn ở đó?

Nó không nói rằng những tập tin có nguồn gốc không có ở đó. Nó nói rằng sourcelệnh không được tìm thấy. Điều này là bình thường, vì kể từ khi bạn bắt đầu tập lệnh của mình bằng #!/bin/shdòng, tập lệnh của bạn sẽ chạy bằng cách sử dụng shvà không bashnhư bạn nghĩ. Tại sao nó bình thường? Bởi vì sourcelệnh là một nội trang Bash, nhưng không phải là shnội dung. Để nguồn một tập tin sh, bạn nên sử dụng .(dấu chấm). Thí dụ:

. /etc/profile
. ~/.profile

Một cách khác là thay đổi dòng shebang thành #!/bin/bashnhư sự hỗn loạn nói trong câu trả lời của mình .


4

Xem câu hỏi SO này :

/bin/shthường là một số vỏ khác cố gắng bắt chước The Shell. Nhiều bản phân phối sử dụng /bin/bashcho sh, nó hỗ trợ nguồn. Tuy nhiên, trên Ubuntu /bin/dashđược sử dụng không hỗ trợ nguồn. Nếu bạn không thể chỉnh sửa tập lệnh, hãy thử thay đổi trình bao chạy nó.


1

Một số vỏ hỗ trợ .thay vì source. Vì vậy, bạn có thể thử một cái gì đó như thế này

. filename

thay vì

source filename

Hy vọng nó hoạt động

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.