Apa arti `(backquote / backtick) dalam perintah?

160

Saya menemukan perintah berikut:

sudo chown `id -u` /somedir

dan saya bertanya-tanya: apa arti `simbol itu. Saya perhatikan misalnya bahwa sementara perintah di atas berfungsi dengan baik, perintah di bawah tidak:

sudo chown 'id -u' /somedir
gws
sumber

Jawaban:

201

Ini backtick . Backtick bukan tanda kutip. Ini memiliki arti yang sangat istimewa. Segala sesuatu yang Anda ketik di antara backtick dievaluasi (dieksekusi) oleh shell sebelum perintah utama (seperti chowndalam contoh Anda), dan output dari eksekusi itu digunakan oleh perintah itu, sama seperti jika Anda mengetikkan output itu di tempat itu di garis komando.

Terus

sudo chown `id -u` /somedir

berjalan secara efektif (tergantung pada ID pengguna Anda ) adalah:

sudo chown 1000 /somedir
  \    \     \     \
   \    \     \     `-- the second argument to "chown" (target directory)
    \    \     `-- your user ID, which is the output of "id -u" command
     \    `-- "chown" command (change ownership of file/directory)
      `-- the "run as root" command; everything after this is run with root privileges

Lihat pertanyaan ini untuk mengetahui mengapa, dalam banyak situasi, bukan ide yang baik untuk menggunakan backtick.

Btw, jika Anda pernah ingin menggunakan backtick secara harfiah, misalnya dalam sebuah string, Anda dapat menghindarinya dengan menempatkan backslash ( \) sebelumnya.

rozcietrzewiacz
sumber
36
Ini menjelaskan backticks dengan cukup baik, tetapi menggunakan $(your expression)adalah cara yang lebih baik untuk melakukan hal yang sama seperti $()memungkinkan Anda untuk membuat ekspresi sarang. misalnya: cd $(dirname $(type -P touch))akan memasukkan Anda ke direktori yang berisi touchperintah
Khaja Minhajuddin
11
@KhajaMinhajuddin Anda pasti benar tentang bersarang - pertanyaan yang disebutkan di atas membahasnya secara rinci. Tetapi meskipun saya pikir ini adalah praktik yang baik untuk digunakan $()dalam kebanyakan situasi, itu tidak membuat backticks menjadi hal yang lebih buruk . Untuk tujuan praktis, kita harus mengakui bahwa mereka jauh lebih cepat untuk mengetik pada baris perintah (2 penekanan tombol dibandingkan dengan setidaknya 5, termasuk Shift).
rozcietrzewiacz
2
@rozcietrzewiacz Komentar terakhir Anda mungkin benar untuk sebagian besar keyboard tetapi $( )jelas lebih mudah untuk mengetik daripada ` `setidaknya pada keyboard Prancis.
jlliagre
1
@KhajaMinhajuddin Anda dapat membuat sarang backticks, tetapi Anda harus melarikan diri dari backticks tingkat 2, & sarang level 2 Anda membutuhkan 3 backticks, lantai 3 menyarang 5 backticks, level 4 7, & c.
JustinCB
66

Saya ingin menambahkan beberapa poin lagi di sini.

Backtick `…`sebenarnya disebut substitusi perintah . Tujuan dari substitusi perintah adalah untuk mengevaluasi perintah yang ditempatkan di dalam backtick dan memberikan hasilnya sebagai argumen terhadap perintah yang sebenarnya.

Substitusi perintah dapat dilakukan dengan dua cara, satu menggunakan $(…)dan yang lain `…`. Keduanya bekerja sama, tetapi $(…)bentuknya adalah cara modern dan memiliki lebih banyak kejelasan dan keterbacaan.

Dan sebagainya

sudo chown $(id -u) /somedir

dapat lebih disukai daripada yang lain.

Dan satu hal lagi yang perlu Anda perhatikan di sini adalah hubungan substitusi perintah dengan aturan kutip bash seperti yang disebutkan dalam dokumen bash .

Jika substitusi muncul dalam tanda kutip ganda, pemisahan kata dan ekspansi nama file tidak dilakukan pada hasil.

Kannan Mohan
sumber
8
Juga, $(...)sarang lebih baik.
Kusalananda
$()dan "``"tidak bekerja dengan cara yang sama
Kun
10

Satu catatan klarifikasi jarang dibahas:

Backticks (kadang-kadang juga disebut Graves karena berfungsi ganda sebagai aksen umum dalam bahasa Prancis dan bahasa lainnya) menggantikan Output Standar saja , tetapi bukan Kesalahan Standar.

Jadi untuk melanjutkan contoh sebelumnya:

file `which hostname`

akan berfungsi seperti yang diharapkan, tetapi di:

file `which hostnameX`

whichakan mengembalikan kesalahan, dan output tersebut masuk ke kesalahan standar, daripada mengganti ke baris perintah di sebelah file; tidak akan ada output standar sama sekali, yang dapat Anda konfirmasikan dengan menjalankan:

which hostnameX

which hostnameX 2>/dev/null

Pada kasus ini,

file `which hostnameX` 

akan menghasilkan dua pesan kesalahan (yang pertama, karena which hostnameXdan yang kedua setelah yang pertama, karena file itu sendiri, yang menemukan bahwa nama file hilang dan seluruh perintah

pada dasarnya akan berkurang menjadi hanya:

file

yang, tentu saja, merupakan penggunaan yang buruk, dan akan mengembalikan kesalahan Penggunaan.

(jika Anda ingin memeriksanya sendiri, Anda dapat mencoba:

file `which hostnameX 2>/dev/null`    # just the file-command bad-usage error msg is printed

file `which hostnameX 2>/dev/null` 2>/dev/null  # now nothing is printed on the screen :)
Dave K.
sumber
4

Backtick `menjalankan konten dari string terlampir, jadi kira-kira seperti ini

file `which hostname`

akan mencari jalan ke perintah hostname, dan kemudian memberi tahu Anda bagaimana itu dibangun.

Perintah yang Anda masukkan dalam pertanyaan Anda berjalan id -uuntuk mendapatkan ID pengguna yang efektif, dan kemudian mengubah kepemilikan / somedir kepada pengguna itu.

Julian
sumber
2

Simbol ini berarti bahwa apa pun yang ada di dalamnya ditafsirkan sebagai hasil dari perintah itu.

sebagai contoh:

$ls /home
one two
$pwd
/usr/three
$cp `pwd` /home
$ls /home
one two three

Hasil di atas dalam threedirektori disalin ke /homedirektori saya .

Hanan N.
sumber
1

Backticks menyerupai substitusi perintah. Sintaks backticks ini kuno, dan mengetahui tanda dolar dengan dua kurung adalah umum: $().

Apa itu substitusi perintah?

Substitusi perintah adalah operasi tunggal dengan sintaks khusus untuk mengeksekusi perintah dan agar hasilnya disimpan ke dalam variabel untuk digunakan nanti.

Contoh dengan tanggal:

thedate=$(date)

Kami kemudian dapat mencetak hasilnya: 'Tanggal adalah% s \ n' "$ thedate" `.

  1. Sintaks substitusi perintah adalah $().
  2. Perintah itu sendiri adalah date.
  3. Menggabungkan keduanya kita dapatkan $(date)yang hasilnya adalah subtitusi
  4. Kami menampilkan nilai output yang disimpan oleh variabel dengan printf, per perintah di atas.
pengguna9303970
sumber