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?

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.


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 .


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.


1

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

. filename

dari pada

source filename

Semoga berhasil

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.