Bagaimana seseorang memilih antara "$0"
dan"${BASH_SOURCE[0]}"
Penjelasan dari GNU ini tidak banyak membantu saya.
BASH_SOURCE
An array variable whose members are the source filenames where the
corresponding shell function names in the FUNCNAME array variable are
defined. The shell function ${FUNCNAME[$i]} is defined in the file
${BASH_SOURCE[$i]} and called from ${BASH_SOURCE[$i+1]}
BASH_SOURCE
telah 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.Jawaban:
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 ,
$0
dapat 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
:$0
adalah bagian dari spesifikasi shell POSIX, sedangkanBASH_SOURCE
, seperti namanya, adalah khusus Bash.[1] Opsional membaca:
${BASH_SOURCE[0]}
vs$BASH_SOURCE
:Bash memungkinkan Anda untuk elemen referensi
0
dari 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 index0
.Menggunakan fitur ini mengaburkan fakta bahwa itu
$arr
adalah sebuah array, itulah sebabnya shell-code linter shellcheck.net yang populer mengeluarkan peringatan berikut (saat tulisan ini dibuat):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
0
yang 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
0
dari variabel array${BASH_SOURCE[@]}
.sumber
$BASH_SOURCE
adalah pilihan yang lebih baik.Skrip ini dapat membantu mengilustrasikan. Skrip luar memanggil skrip tengah, yang memanggil skrip dalam:
Namun, jika kita mengubah panggilan skrip menjadi
source
pernyataan:sumber
Untuk portabilitas, gunakan
${BASH_SOURCE[0]}
jika sudah ditentukan, dan$0
sebaliknya. Itu memberiKhususnya, katakanlah zsh, $ 0 memang berisi jalur file yang benar meskipun skripnya adalah
source
d.sumber