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
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.
$(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$()
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, termasukShift
).$( )
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
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 .
sumber
$(...)
sarang lebih baik.$()
dan"``"
tidak bekerja dengan cara yang samaSatu 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:
akan berfungsi seperti yang diharapkan, tetapi di:
which
akan mengembalikan kesalahan, dan output tersebut masuk ke kesalahan standar, daripada mengganti ke baris perintah di sebelahfile
; tidak akan ada output standar sama sekali, yang dapat Anda konfirmasikan dengan menjalankan:Pada kasus ini,
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 perintahpada dasarnya akan berkurang menjadi hanya:
yang, tentu saja, merupakan penggunaan yang buruk, dan akan mengembalikan kesalahan Penggunaan.
(jika Anda ingin memeriksanya sendiri, Anda dapat mencoba:
sumber
Backtick `menjalankan konten dari string terlampir, jadi kira-kira seperti ini
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.sumber
Simbol ini berarti bahwa apa pun yang ada di dalamnya ditafsirkan sebagai hasil dari perintah itu.
sebagai contoh:
Hasil di atas dalam
three
direktori disalin ke/home
direktori saya .sumber
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:
Kami kemudian dapat mencetak hasilnya: 'Tanggal adalah% s \ n' "$ thedate" `.
$()
.date
.$(date)
yang hasilnya adalah subtitusiprintf
, per perintah di atas.sumber