Catatan: Untuk solusi yang sesuai dengan POSIX, lihat jawaban ini .
${BASH_SOURCE[0]}(atau, lebih sederhananya, $BASH_SOURCE[1]
) berisi jalur (berpotensi relatif) dari skrip yang memuat dalam semua skenario pemanggilan, terutama juga ketika skrip bersumber , yang tidak benar untuk $0.
Lebih lanjut, seperti yang ditunjukkan Charles Duffy , $0dapat disetel ke nilai arbitrer oleh penelepon.
Di sisi lain, $BASH_SOURCE bisa kosong, jika tidak ada file bernama yang terlibat; misalnya:
echo 'echo "[$BASH_SOURCE]"' | bash
Contoh berikut menggambarkan hal ini:
Script foo:
#!/bin/bash
echo "[$0] vs. [${BASH_SOURCE[0]}]"
$ bash ./foo
[./foo] vs. [./foo]
$ ./foo
[./foo] vs. [./foo]
$ . ./foo
[bash] vs. [./foo]
$0adalah bagian dari spesifikasi shell POSIX, sedangkan BASH_SOURCE, seperti namanya, adalah khusus Bash.
[1] Opsional membaca: ${BASH_SOURCE[0]}vs$BASH_SOURCE :
Bash memungkinkan Anda untuk elemen referensi 0dari berbagai variabel menggunakan skalar notasi: alih-alih menulis ${arr[0]}, Anda dapat menulis $arr; dengan kata lain: jika Anda mereferensikan variabel seolah-olah itu adalah skalar , Anda mendapatkan elemen di index 0.
Menggunakan fitur ini mengaburkan fakta bahwa itu $arradalah sebuah array, itulah sebabnya shell-code linter shellcheck.net yang populer mengeluarkan peringatan berikut (saat tulisan ini dibuat):
SC2128: Memperluas larik tanpa indeks hanya memberikan elemen pertama.
Di samping catatan: Meskipun peringatan ini membantu, ini bisa lebih tepat, karena Anda belum tentu mendapatkan elemen pertama : Ini secara khusus adalah elemen pada indeks 0yang dikembalikan, jadi jika elemen pertama memiliki indeks yang lebih tinggi - yang mana dimungkinkan di Bash - Anda akan mendapatkan string kosong; coba 'a[1]='hi'; echo "$a"'.
(Sebaliknya, zsh, pernah murtad itu, memang tidak kembali elemen pertama, terlepas dari indeks).
Anda dapat memilih untuk menjauhkan diri dari fitur ini karena ketidakjelasan, tetapi bekerja diduga dan, pragmatis berbicara, Anda akan jarang, jika pernah, kebutuhan untuk mengakses indeks lain selain 0dari variabel array ${BASH_SOURCE[@]}.
BASH_SOURCEtelah ditambahkan di bash-3.0-alpha. Anda mungkin tidak memilikinya, tergantung pada rezim pengujian Anda. Saya menemukan itu hilang pada awal Solaris dan OS X. Juga lihat kembali: hanya dapat 'kembali' dari fungsi atau skrip bersumber pada U & L.SE.