Di tempat lain saya telah melihat fungsi cd seperti di bawah ini:
cd()
{
builtin cd "$@"
}
mengapa disarankan untuk menggunakan $@
bukan $1
?
Saya membuat direktori uji "rst" dan memanggil skrip yang berisi fungsi ini dan itu berhasil baik
$ . cdtest.sh "r st"
tetapi $ . cdtest.sh r st
gagal apakah saya menggunakan "$@"
atau"$1"
cd "$*"
juga tidak akan bekerja dengan benar dengan lebih dari 1 arg.Jawaban:
Karena, menurut
bash(1)
,cd
butuh argumenjadi karena itu direktori sebenarnya mungkin tidak berada di dalam
$1
yang bisa menjadi pilihan seperti-L
atau bendera lain.Seberapa buruk ini?
Hal-hal bisa menjadi sangat serba salah jika Anda tidak berada di tempat yang Anda harapkan menggunakan
cd "$1"
...sumber
Menggunakan
"$@"
akan meneruskan semua argumen kecd
tempat yang$1
hanya akan melewati argumen pertama.Dalam contoh Anda
selalu berfungsi karena Anda hanya melewati satu argumen, tetapi jika Anda harus memberikan sebuah flag juga
Maka hanya
"$@"
akan mengeksekusi dengan benar di mana"$1"
akan berkembang menjadicd -L
kehilangan direktori sepenuhnya.Namun
Gagal dalam kedua kasus saat Anda mengirimkan dua parameter ke cd,
r
danst
yang bukan cara yang valid untuk mengeksekusi cd. Parameter dipisahkan oleh spasi yang harus dikutip (seperti dalam contoh pertama Anda) atau melarikan diri (r\ st
) untuk diperlakukan sebagai satu argumen.Dalam kasus cd namun sangat jarang untuk lulus dalam bendera dan Anda tidak bisa lewat di beberapa direktori sehingga Anda tidak akan melihat perbedaan dalam penggunaan dunia nyata baik
"$1"
atau"$@"
untuk cd. Tetapi untuk perintah lain, Anda akan melihat perbedaan sehingga praktik terbaik adalah selalu menggunakan"$@"
ketika Anda ingin membuat fungsi pembungkus atau skrip seperti ini.sumber
Ada juga kasus ketika tidak ada argumen:
cd
tanpa perubahan argumen ke direktori home. Tanpa argumen apa pun,"$@"
ekspansi menjadi kosong, tetapi"$1"
ekspansi ke string kosong. Ini berbeda:sumber
cd
adalah hal yang baik. Ini menyebabkan kesalahan alih-alih mengubah ke direktori home. Dengan beberapa perintah lain, terutamarsync
, argumen nol pertama menyebabkan perilaku yang tidak terduga (termasuk direktori saat ini di sumber transfer).Argumen untuk skrip bash dibatasi oleh ruang. $ 1 adalah argumen pertama. Dalam contoh Anda ...
Dalam contoh 1, $ 1 adalah string "r st" ... dalam contoh kedua, $ 1 adalah string satu karakter 'r' ...
$ @ adalah semua argumen.
sumber