Saya mencoba perintah
$ b=5; echo `$b`;
-bash: 5: command not found
tetapi tidak mencetak 5 sebagaimana mestinya. Apa yang kulewatkan di sini?
Apa arti `(backquote / backtick) dalam perintah? tampaknya mengatakan bahwa `
mengevaluasi perintah di dalam dan menggantinya dengan output.
bash
shell
command-substitution
coolcric
sumber
sumber
Jawaban:
Teks di antara backtick dieksekusi dan digantikan oleh output dari perintah (minus karakter garis belakang tertinggal, dan berhati-hatilah bahwa perilaku shell bervariasi ketika ada karakter NUL dalam output). Itu disebut substitusi perintah karena diganti dengan output dari perintah. Jadi jika Anda ingin mencetak 5, Anda tidak dapat menggunakan backticks, Anda dapat menggunakan tanda kutip, suka
echo "$b"
atau hanya menjatuhkan kutipan dan gunakanecho $b
.Seperti yang Anda lihat, karena
$b
berisi 5, ketika menggunakan backticksbash
sedang mencoba menjalankan perintah5
dan karena tidak ada perintah seperti itu, gagal dengan pesan kesalahan.Untuk memahami cara kerja backticks, coba jalankan ini:
cat /etc/passwd |head -n1
harus mencetak baris pertama/etc/passwd
file. Tapi karena kami menggunakan backticks, itu tidak mencetak ini di konsol. Sebaliknya itu disimpan dalamA
variabel. Anda dapat mengulangi$A
hal ini. Perhatikan bahwa cara mencetak baris pertama yang lebih efisien adalah dengan menggunakan perintah,head -n1 /etc/passwd
tetapi saya ingin menunjukkan bahwa ekspresi di dalam backticks tidak harus sederhana.Jadi jika baris pertama dari / etc / passwd adalah
root:x:0:0:root:/root:/bin/bash
, perintah pertama akan diganti secara dinamis dengan bash toA="root:x:0:0:root:/root:/bin/bash"
.Perhatikan bahwa sintaks ini dari shell Bourne. Mengutip dan melarikan diri dengan cepat menjadi mimpi buruk dengan itu terutama ketika Anda mulai bersarang. Ksh memperkenalkan
$(...)
alternatif yang sekarang distandarisasi ( POSIX ) dan didukung oleh semua shell (bahkan shell Bourne dari Unix v9). Jadi, Anda harus menggunakannya$(...)
sebagai gantinya saat ini kecuali Anda harus portabel untuk cangkang Bourne yang sangat tua.Perhatikan juga bahwa output dari
`...`
dan$(...)
tunduk pada pemisahan kata dan pembuatan nama file seperti halnya ekspansi variabel (dalam zsh, hanya pemisahan kata), jadi umumnya perlu dikutip dalam konteks daftar.sumber
you can use quotation marks, like echo "$b"
=> apakah "" melakukan sesuatu yang istimewa? Tampaknyaecho $b
akan berhasil juga.echo
perintah tidak peduli dengan jumlah argumen yang didapat sehingga jikab
memiliki beberapa spasi di dalamnya, ia akan mendapatkan beberapa argumen dan masih akan mencetaknya. Ini mungkin tidak berlaku untuk perintah lain (terutama ketika variabel tidak diatur) jadi saya cenderung selalu mengelilingi variabel dengan tanda kutip.(POSIX)
akan menjadi tautan ke standar yang sebenarnya.Backtick melakukan persis seperti yang Anda katakan. Anda telah menetapkan variabel ke integer. Ketika Anda meletakkan variabel itu di dalam backticks, bash akan mencoba menjalankannya sebagai perintah. Karena ini bukan perintah, Anda mendapatkan kesalahan yang Anda lihat.
Yang ingin Anda lakukan hanyalah:
Untuk memahami backticks lebih baik, bandingkan dengan:
sumber
Selangkah demi selangkah, baris Anda harus menjelaskannya.
b
menjadi 5$b
(berjalan secara efektif5
)echo
adalah hasil evaluasi di atas.Jadi ya, output yang Anda dapatkan diharapkan. Anda mengevaluasi konten variabel, bukan perintah yang sebenarnya Anda pikirkan. Semua yang Anda masukkan ke dalam backticks dievaluasi secara simplay (dijalankan) di shell (sub) baru.
sumber