it-swarm-id.com

Apa perbedaan antara $ (barang) dan `barang`?

Ada dua sintaks untuk substitusi perintah: dengan tanda kurung dolar dan dengan backticks. Menjalankan top -p $(pidof init) dan top -p `pidof init` memberikan output yang sama. Apakah kedua cara ini melakukan hal yang sama, atau adakah perbedaan?

270
tshepang

Backquotes gaya lama ` ` Benar-benar memperlakukan backslash dan bersarang sedikit berbeda. $() gaya baru menginterpretasikan semuanya di antara ( ) 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 backquote bersarang lolos:

echo `uname | \`echo cat\``
Linux

backslash menyenangkan:

echo $(echo '\\')
\\

echo `echo '\\'`
\

$() gaya baru berlaku untuk semua POSIX - shell yang sesuai.
Seperti mouviciel tunjukkan, gaya lama ` ` Mungkin diperlukan untuk shell yang lebih lama.

Terlepas dari sudut pandang teknis, gaya lama ` ` Juga memiliki kelemahan visual:

  • Sulit diketahui: I like $(program) better than `program`
  • Mudah bingung dengan satu kutipan: '`'`''`''`'`''`'
  • Tidak begitu mudah untuk mengetik (mungkin bahkan tidak pada tata letak standar keyboard)

(dan SE menggunakan ` ` untuk tujuan sendiri, sangat merepotkan menulis jawaban ini :)

364
wag

Perbedaan yang jelas saya amati adalah bahwa Anda tidak dapat membuat backtick sementara Anda dapat membuat sarang $(). Mungkin keduanya ada karena alasan warisan. Demikian pula dengan . dan source perintah adalah sinonim.

41
balki

$() tidak bekerja dengan Bourne Shell lama. Tapi itu sudah terjadi tahun beberapa dekade sejak saya bekerja dengan Bourne Shell.

28
mouviciel

Catatan lain, $() akan menggunakan lebih banyak sumber daya sistem daripada menggunakan backtick, tetapi sedikit lebih cepat.

Dalam Menguasai skrip Unix Shell , Randal K. Michael telah melakukan tes dalam bab bernama "24 Cara untuk Memproses File Baris-demi-Baris".

6
cuonglm

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.)

5
phk

Sintaks $() tidak akan bekerja dengan Shell bourne lama.
Dengan cangkang yang lebih baru ` ` Dan $() adalah sama tetapi $() jauh lebih nyaman untuk digunakan ketika Anda perlu membuat banyak perintah.

Contohnya :

echo $(basename $(dirname $(dirname /var/adm/sw/save )))

lebih mudah untuk mengetik dan debug daripada:

echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``
1
Emmanuel