Ada dua sintaks untuk substitusi perintah: dengan dolar-tanda kurung dan dengan backticks. Berjalan top -p $(pidof init)
dan top -p `pidof init`
memberikan hasil yang sama. Apakah kedua cara ini melakukan hal yang sama, atau adakah perbedaan?
Ada dua sintaks untuk substitusi perintah: dengan dolar-tanda kurung dan dengan backticks. Berjalan top -p $(pidof init)
dan top -p `pidof init`
memberikan hasil yang sama. Apakah kedua cara ini melakukan hal yang sama, atau adakah perbedaan?
Jawaban:
Backquote gaya lama ` `
memang memperlakukan backslash dan bersarang sedikit berbeda. Gaya baru $()
mengartikan semuanya ( )
sebagai perintah.
echo $(uname | $(echo cat))
Linux
echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat
berfungsi jika backquotes bersarang lolos:
echo `uname | \`echo cat\``
Linux
backslash menyenangkan:
echo $(echo '\\')
\\
echo `echo '\\'`
\
Gaya baru ini $()
berlaku untuk semua shell yang sesuai dengan POSIX .
Seperti yang ditunjukkan mouviciel , gaya lama ` `
mungkin diperlukan untuk kulit kerang yang lebih tua.
Terlepas dari sudut pandang teknis, gaya lama ` `
juga memiliki kelemahan visual:
I like $(program) better than `program`
'`'`''`''`'`''`'
(dan menggunakan SE ` `
untuk tujuan sendiri, itu adalah rasa sakit menulis jawaban ini :)
{ }
biasanya disebut "kurung keriting" atau "kurung kurawal" en.wikipedia.org/wiki/Braces_(punctuation)#Braces
`
adalah kunci mati, jadi saya harus mengetikkan backtick ganda (sesuatu yang biasanya saya lupa saya bisa melakukannya) atau backtick lalu spasi, yang merupakan rasa sakit.
Perbedaan jelas yang saya amati adalah bahwa Anda tidak dapat membuat sarang backtick sementara Anda bisa bersarang $()
. Mungkin keduanya ada karena alasan warisan. Demikian pula, perintah .
dan source
adalah sinonim.
source
. Dash adalah salah satu contohnya.
$(...)
dan `...`
standar (yang terakhir yang usang) sementara .
standar tapi tidaksource
(t)csh
mereka tidak bisa bersarang. (t)csh
tidak mendukung $(...)
sekalipun. Mereka memang mendukung source
(dan tidak .
).
$()
tidak bekerja dengan shell Bourne lama. Tapi sudah bertahun-tahun sejak saya bekerja dengan shell Bourne tua.
Catatan lain, $()
akan menggunakan lebih banyak sumber daya sistem daripada menggunakan backticks, tetapi sedikit lebih cepat.
Dalam Menguasai scripting shell Unix , Randal K. Michael telah melakukan tes dalam bab bernama "24 Cara untuk Memproses File Baris-demi-Baris".
$()
membuat skrip Anda satu byte lebih besar daripada jika digunakan `
(dengan asumsi Anda tidak membuat sarang dan tidak menggunakan backslash di dalamnya). Mengenai yang mana akan lebih cepat untuk diuraikan, itu akan bervariasi di antara cangkang dan tidak relevan jika diabaikan dibandingkan dengan biaya pembuatan pipa dan percabangan proses yang memerlukan substitusi.
Untuk menambahkan apa yang orang lain katakan di sini, Anda dapat menggunakan backticks untuk mensimulasikan komentar sebaris:
echo foo `# I'm a comment!` bar
Outputnya adalah: foo bar
.
Lihat yang berikut untuk informasi lebih lanjut: https://stackoverflow.com/a/12797512 (Perhatikan juga komentar di bawah posting itu.)
The $()
sintaks tidak akan bekerja dengan shell Bourne tua.
Dengan cangkang yang lebih baru ` `
dan $()
setara tetapi $()
jauh lebih mudah digunakan ketika Anda perlu membuat banyak perintah.
Misalnya :
echo $(basename $(dirname $(dirname /var/adm/sw/save )))
lebih mudah untuk mengetik dan debug daripada:
echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``