Bekerja pada beberapa fungsi bash, saya tidak tahu source ...
perintah, jadi saya menggunakannya eval $(cat ...)
sebagai gantinya. Sekarang saya bertanya-tanya, apakah saya harus mengubah setiap penggunaan itu, atau apakah fungsinya sama?
Mereka tampaknya bekerja sama sekarang, tetapi mungkin akan ada beberapa perbedaan menyesatkan nanti, saya hanya ingin tahu.
command-line
bash
Benjamin
sumber
sumber
eval "$(cat file)"
source
karena itu adalah perintah yang dibuat khusus untuk ini.Seperti yang telah disebutkan oleh @glennjackman, Anda akan ingin mengutip substitusi perintah, jika tidak pemisahan kata dan perluasan pathname akan mengubah konten sebelum ia dieksekusi. Dan sementara keduanya akan menjalankan perintah dari file, ada perbedaan.
Saat Anda sumber skrip, berbagai variabel shell khusus akan dimodifikasi, terutama
BASH_SOURCE
,BASH_LINENO
danFUNCNAME
array. Ini berguna untuk mencetak pesan kesalahan dan debugging.Anda dapat kembali dari skrip bersumber dengan
return
perintah (help return
). Dengan eval, Anda tidak akan mendapatkan efek itu. Dan juga perangkap RETURN tidak akan dipicu untuk eval.Saat mengambil skrip, Anda bisa memberikan argumen padanya. Anda tidak dapat melakukan itu dengan eval itu.
Dengan eval, substitusi perintah akan membaca seluruh konten file ke dalam memori sebelum meneruskannya ke eval. Ketika Anda sumbernya, bash akan membaca dari file saat berjalan.
sumber
Ada ringkasan bagus dari sumber, eval dan eksekutif apa yang dilakukan di sini: http://www.unix.com/shell-programming-scripting/54347-bash-shell-exec-eval-source-looking-help-understand.html
Saya pikir penggunaan eval dan sumber file Anda akan melakukan hal yang sama. Namun, saya tidak sepenuhnya yakin bahwa variabel di dalam subskrip akan berperilaku sama dalam hal apa pun. Saya akan merekomendasikan menggunakan sumber jika mungkin, karena ini adalah cara yang lebih mudah dan membuat kode Anda lebih mudah dibaca.
sumber
$(cat file)
->$(< file)