Jawaban:
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 chown
dalam 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.
$()
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
).
$( )
jelas lebih mudah untuk mengetik daripada ` `
setidaknya pada keyboard Prancis.
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.
$(...)
sarang lebih baik.
$()
dan "``"
tidak bekerja dengan cara yang sama
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`
which
akan 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 hostnameX
dan 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 :)
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 -u
untuk mendapatkan ID pengguna yang efektif, dan kemudian mengubah kepemilikan / somedir kepada pengguna itu.
Backticks menyerupai substitusi perintah. Sintaks backticks ini kuno, dan mengetahui tanda dolar dengan dua kurung adalah umum: $()
.
Substitusi perintah adalah operasi tunggal dengan sintaks khusus untuk mengeksekusi perintah dan agar hasilnya disimpan ke dalam variabel untuk digunakan nanti.
thedate=$(date)
Kami kemudian dapat mencetak hasilnya: 'Tanggal adalah% s \ n' "$ thedate" `.
$()
.date
.$(date)
yang hasilnya adalah subtitusiprintf
, per perintah di atas.
$(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 berisitouch
perintah