menjalankan skrip dengan “. "Dan dengan" sumber "

25
  1. Saya bertanya-tanya apakah dua cara menjalankan skrip bash ini setara?

    . ./myScript.sh
    
    source myScript.sh
    
  2. Apakah keduanya menjalankan konten skrip alih-alih menjalankan skrip, yaitu tidak membuat subkulit untuk menjalankan skrip?
Tim
sumber
1
Hei, itu ada di halaman manual!
alex
@alex: tolong tunjukkan padaku? man ., man sourceatau apa pun yang saya belum tahu.
Tim
2
Lihat type .danhelp .
rozcietrzewiacz
man $SHELL,/source
alex
4
. lebih portabel menurut yang lain.
l0b0

Jawaban:

21
  1. Mereka setara dalam bash dalam hal mereka melakukan hal yang persis sama. Di sisi lain, sourceadalah 5 karakter lebih panjang dan tidak portabel untuk shell POSIX-only atau Bourne sedangkan .(dot) adalah, jadi saya tidak pernah repot-repot menggunakan source.

  2. Itu benar - sumber file menjalankan perintah di shell saat ini dan itu akan mempengaruhi lingkungan shell Anda saat ini. Anda masih bisa meneruskan argumen ke file bersumber dan bash akan benar-benar mencari $PATHnama file seperti perintah normal jika tidak mengandung garis miring.


Tidak terkait dengan pertanyaan asli .vs source, tetapi dalam contoh Anda,

. ./myScript.sh 

tidak identik dengan

source myScript.sh

karena sementara .dan sourcesecara fungsional identik, myScript.shdan ./myScript.shtidak sama. Karena ./myScript.shmengandung garis miring, itu ditafsirkan sebagai jalur dan shell hanya menggunakan ./myScript.sh. Namun, myScript.shtidak memiliki garis miring sehingga shell melakukan $PATHpencarian terlebih dahulu. Ini adalah perilaku standar yang ditentukan POSIX untuk .. Sebagian besar shell default untuk ini meskipun mereka dapat menambahkan ekstensi (seperti mencari di direktori kerja saat ini setelah pencarian jalur) atau opsi untuk mengubah perilaku ./ source.

jw013
sumber
2
perilaku ketika path yang disediakan file tidak mengandung /shell-dependen dan untuk bashdan zshtergantung pada apakah mode POSIX diaktifkan atau tidak. Juga perhatikan bahwa dalam banyak implementasi ksh, .berperilaku berbeda dari source.
Stéphane Chazelas
@StephaneChazelas Ya, Anda benar. Saya menambahkan catatan untuk menjelaskan bahwa deskripsi di atas adalah dari standar POSIX.
jw013
8

Ya, mereka setara. Tidak ada perbedaan fungsional; .hanya sinonim bawaan untuk source.

(Edit: Rupanya ini hanya berlaku untuk bashdan zshBeberapa kerang ringan tidak memiliki. source, Hanya .ditentukan oleh POSIX sehingga ksh, dash, ash, dll mungkin tidak memiliki sourceLihat. Jawaban jw013 ini untuk info.)

Caleb
sumber
Terima kasih! Tapi $ alias .hasilnya bash: alias: .: not found .
Tim
Itu adalah keduanya builtin dan alias juga builtin. Ini didokumentasikan , tetapi saya kira 'sinonim' adalah istilah yang tepat dalam kasus ini, bukan 'alias'.
Caleb