Mengapa memulai perintah shell dengan backslash?

Jawaban:

200
alias curl='curl --some --default --options'

Jika Anda memiliki alias untuk curldan Anda tidak ingin menggunakannya, meletakkan backslash di depan menonaktifkan alias dan menjalankan biner ikal secara langsung.

Perhatikan bahwa ini hanya berlaku pada shell interaktif. Alias ​​tidak berlaku dalam skrip sehingga tidak perlu ada di sana.

John Kugelman
sumber
4
Alias ​​dapat digunakan dalam skrip dengan menggunakan shopt -s expand_aliasessebelum menggunakan alias
Alex
@ lbaby Sama di Kornshell. Anda membatalkan perintah alias yang mungkin dengan meletakkan backslash di depannya. Ini sangat umum di Kornshell ketika orang mendefinisikan perintah meminta dengan nama direktori di dalamnya . Perhatikan baris pertama dari fungsi ini adalah `\ cd" $ @ "`.
David W.
1
Perlu dicatat bahwa \curltidak melewati fungsi shell yang dinamai curl. Untuk itu, Anda dapat menggunakan perintah built-in bash command:command curl ...
Keith Thompson
7
Cara menulis yang lebih mudah dipahami \curl ...adalahcommand curl ...
glenn jackman
Perhatikan bahwa dash(dan mungkin kerang lainnya, meskipun Anda benar untuk bashtanpa expand_aliases) tidak memperluas alias dalam skrip.
Adrian Günter
163

Spesifikasi shell (Bourne / POSIX) mengatakan bahwa substitusi alias dalam shell interaktif ditekan ketika ada karakter kata perintah yang dikutip. Sebuah backslash adalah salah satu cara untuk melakukan itu, tetapi ada juga cara lain yang terkenal untuk mengutip: kutipan tunggal dan ganda. Semua hal berikut akan menekan penggantian alias:

 \curl
 cur\l
 \c\u\r\l
 "c"url
 "curl"
 "c""u""r""l"
 'curl'
 'cu'"rl"

Menggunakan \curl hanyalah cara yang paling umum dan mudah dibaca. Karena ini adalah fitur standar, Anda dapat mengharapkannya berfungsi di semua cangkang Bourne-heritage.

\curlterlihat agak seperti perintah TeX, bukan? :-)

Jens
sumber
14
+1 untuk memberikan alasan spesifik mengapa \curlmemotong alias dengan nama yang sama; perhatikan bahwa hanya alias yang dilewati dengan cara ini, bukan fungsi shell ; command curl ...akan memastikan melewati baik .
mklement0
1
Saya tidak melihat inti dari kalimat terakhir. Ngomong-ngomong, Anda hanya menyebutkan alias bypass , tetapi segala jenis kutipan juga akan mem-bypass kata kunci.
gniourf_gniourf
@ mklement0 Tidak cukup memastikan… command() { echo "Not command, lol!"; } ; command -V echo ; \command -V echo ; \command command echo "This is command! (masking despair)"mencetak Not command, lol!x 3.
Adrian Günter
3
@ AdrianGünter: Ya, jika Anda mengganti command sendiri dengan fungsi shell, Anda mengalahkan mekanisme. Apa yang ditunjukkan oleh contoh Anda adalah yang \ tidak mem-bypass fungsi , seperti yang dinyatakan. Sebuah contoh non-diri sendiri: date() { echo 'not date'; }; date; command date. Jika Anda khawatir tentang berbahaya gangguan dengan command, melihat stackoverflow.com/a/35931876/45375
mklement0
@ mklement0 Saya mengerti semua itu, tapi maksud saya adalah jika seseorang tidak dapat menjamin bahwa nama perintah lain tidak ada sebagai fungsi (yaitu, Anda tidak memiliki kontrol atas lingkungan eksekusi Anda), maka orang juga tidak dapat mengandalkan commanduntuk tidak ditimpa. Dari tautan Anda sendiri:Thus, with no control over the execution environment, you cannot write shell scripts that are fully immune to tampering, unless you know that your code will be executed by dash, ksh, or bash (with the workaround in place)
Adrian Günter