Mengapa menggunakan parens daripada backticks untuk menjalankan perintah 'in situ'?

7

Saya baru-baru ini mulai menggeser skrip shell saya dari menggunakan backticks ke parens untuk mengeksekusi perintah in situ dan menggunakan hasilnya dalam sesuatu yang lain. Misalnya:

for line in `cat file`
do
    echo "$line"
done

Sekarang saya menggunakan parens, sebagai gantinya:

for line in $(cat file)
...

Apa perbedaan yang sebenarnya antara kedua metode, dan mengapa substitusi paren dianggap lebih baik daripada backticks?

warren
sumber
(Pedantry berikut) Perhatikan bahwa dalam bash, Anda dapat menggantinya $(cat file)dengan $(< file)yang dilakukan sepenuhnya dalam shell (menyimpan mikrodetik berharga jika tidak terbuang untuk menghasilkan proses kucing).
glenn jackman
@grawity - ini adalah contoh yang sepenuhnya dibuat untuk menunjukkan perbedaan dalam dua pendekatan
warren
3
Juga, BashFAQ / 082 tentang pertanyaan ini.
grawity

Jawaban:

13

Tidak ada perbedaan fungsional, namun $()membuat bersarang sedikit lebih bagus dan lebih mudah diikuti. Perhatikan contoh konyol ini:

$ echo `echo \`echo \\\`echo foo\\\`\``
foo

vs.

$ echo $(echo $(echo $(echo foo)))
foo

Sekarang pertimbangkan untuk melakukannya dengan serangkaian perintah kompleks yang melakukan sesuatu yang bermanfaat;).

Kesalahan fatal
sumber