Dalam salinan conda.sh
skrip saya, saya melihat baris-baris berikut:
if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
SYSP=$(\dirname "${CONDA_EXE}")
else
SYSP=$(\dirname "${CONDA_EXE}")
SYSP=$(\dirname "${SYSP}")
fi
Saya ingin tahu mengapa ada garis miring terbalik di depan yang d
di dirname
. Saya tidak percaya itu perlu. Penggunaan backslash ini juga muncul di tempat lain di file sumber. Apakah ada alasan untuk melakukan ini yang saya lewatkan?
bash
shell-script
extremeaxe5
sumber
sumber
Jawaban:
Backslash akan menekan ekspansi alias, yaitu mengeksekusi perintah asli dan memastikan bahwa versi alias tidak berjalan. Skrip tanpa sadar dapat dijalankan dengan ekspansi alias saat sistem telah disetel
shopt -s expand_aliases
(khusus BASH) atau jika dijalankan menggunakansource
.Beberapa sysadmin suka meletakkan backslash dalam segala hal sebagai tindakan pencegahan terhadap efek samping alias, untuk berjaga-jaga kalau itu tidak sengaja alias di tempat lain dan alias akan diperluas seperti yang dijelaskan sebelumnya. Misalnya, jika sistem telah menetapkan ini di
alias dirname='dirname -z'
suatu tempat dan kondisi memungkinkan alias untuk diperluas, maka skrip yang mencoba memanggil dirname sayangnya akan memanggildirname -z
sebaliknya, yang bukan skrip yang dimaksudkan.Jika ada kepastian bahwa alias tersebut tidak ada, kami dapat menghapus semua backslash dan itu akan berfungsi dengan baik.
Atau, seseorang dapat menggunakan
command
alih-alih versi backslash untuk menekan alias. Jadi, alih-alih\dirname
, seseorang dapat menggunakancommand dirname
, yang mungkin terlihat lebih mudah dibaca. (Untuk perintah bawaan seperticd
, seseorang harus menggunakanbuiltin
sebagai gantinya). Saya lebih suka ini, karena juga memotong fungsi dengan nama yang sama dan alias.sumber
unalias -a
, yang menghilangkan semua alias.\unalias -a
untuk menekan ekspansi alias/usr/bin/dirname
?/bin/ed
di Ubuntu vs/usr/bin/ed
di CentOS. Menempatkan di jalur lengkap membuat skrip kurang portabel.DIRNAME=$(which dirname)
, karenawhich
tidak melihat alias?Jika
conda.sh
file dimaksudkan untuk bersumber, maka garis miring terbalik adalah untuk memotong alias. Bash biasanya menonaktifkan ekspansi alias untuk eksekusi skrip, tetapi untuk file bersumber, yang dapat berjalan dalam shell interaktif, bukan itu masalahnya. Jadidirname
mungkin saja menjalankan alias bernamadirname
, tetapi\dirname
akan melewatkan ekspansi alias dan menjalankan fungsi atau perintah bernamadirname
. (Namun, bukan hanya garis miring terbalik, kutipan apa pun akan berlaku.)sumber
command dirname
.\command dirname
, kalau-kalau ada orang yang membuat aliascommand
juga.): |