Pesan kesalahan 'sumber: tidak ditemukan' saat menjalankan skrip

35

Saya membuat skrip pengaturan otomatis kecil yang akan memodifikasi /etc/profiledan $HOME/.profilejika beberapa jalur tidak diekspor. Lalu, saya ingin memuat ulang ini secara otomatis.

Saya telah membaca yang sourcemelakukan ini, jadi saya menyalakan terminal saya dan masuk:

source /etc/profile
source ~/.profile

Dari terminal, itu tidak menghasilkan kesalahan.

Namun, menempatkan kedua perintah ini di dalam hasil skrip Bash di source: not found.

  1. Bagaimana saya bisa yakin bahwa skrip dijalankan oleh Bash, bahkan jika #!/bin/shditentukan (tampaknya, itu tidak menjaminnya)?
  2. Mengapa dikatakan bahwa kedua sumber ini tidak dapat ditemukan ketika mereka tidak salah lagi di sana?
Yanick Rochon
sumber

Jawaban:

54

/bin/shtidak bash. Untuk menjalankan skrip Anda bash, tulis #!/bin/bashsebagai baris pertama dalam skrip Anda.

Kesalahan source: not foundtidak dijatuhkan, karena /etc/profiletidak ditemukan. Itu dijatuhkan, karena sourcetidak ditemukan. sourceadalah fungsi bawaan Bash, dan Anda tidak menjalankan skrip dengan bash. Jadi sudah jelas mengapa tidak ditemukan. Ubah #!baris dalam skrip, dan itu akan berhasil.

kekacauan
sumber
9

1. Bagaimana saya bisa yakin bahwa skrip dijalankan oleh Bash, bahkan jika #!/bin/shditentukan (tampaknya, itu tidak menjaminnya)?

Untuk memastikan bahwa skrip yang ditulis untuk shshell (seperti dalam kasus Anda - lihat Apa perbedaan antara #! / Bin / sh dan #! / Bin / bash? ) Dijalankan oleh Bash, jalankan saja perintah berikut:

bash script_name

Dengan demikian, Anda tidak akan mendapatkan kesalahan itu lagi.

2. Mengapa dikatakan bahwa kedua sumber ini tidak dapat ditemukan ketika keduanya ada di sana?

Itu tidak mengatakan bahwa file-file yang bersumber tidak ada di sana. Dikatakan bahwa sourceperintah itu tidak ditemukan. Ini normal, karena sejak Anda memulai skrip dengan #!/bin/shbaris, skrip Anda akan berjalan menggunakan shdan bukan bashseperti yang Anda pikirkan. Kenapa itu normal? Karena sourceperintah adalah Bash builtin, tetapi bukan shbuiltin. Untuk sumber file sh, Anda harus menggunakan .(dot). Contoh:

. /etc/profile
. ~/.profile

Cara lain adalah mengubah garis shebang menjadi #!/bin/bashseperti kata chaos dalam jawabannya .

Radu Rădeanu
sumber
4

Lihat pertanyaan SO ini :

/bin/shbiasanya beberapa shell lain mencoba meniru The Shell. Banyak distribusi digunakan /bin/bashuntuk sh, mendukung sumber. Di Ubuntu, /bin/dashdigunakan, yang tidak mendukung sumber. Jika Anda tidak dapat mengedit skrip, coba ganti shell yang menjalankannya.

muru
sumber
1

Beberapa cangkang mendukung, .bukan source. Jadi, Anda dapat mencoba sesuatu seperti ini

. filename

dari pada

source filename

Semoga berhasil

Shivam Agrawal
sumber