Untuk menyimpan output dari suatu perintah sebagai variabel di sh / ksh / bash, Anda bisa melakukan keduanya
var=$(command)
atau
var=`command`
Apa bedanya jika ada di antara kedua metode?
Untuk menyimpan output dari suatu perintah sebagai variabel di sh / ksh / bash, Anda bisa melakukan keduanya
var=$(command)
atau
var=`command`
Apa bedanya jika ada di antara kedua metode?
Jawaban:
Backtick / gravemarks telah usang $()karena substitusi perintah karena $()dapat dengan mudah bersarang di dalam dirinya sendiri seperti pada $(echo foo$(echo bar)). Ada perbedaan lain seperti bagaimana backslash diuraikan dalam versi backtick / gravemark, dll.
Lihat BashFAQ / 082 untuk beberapa alasan untuk selalu lebih menyukai sintaks $ (...).
Lihat juga spesifikasi POSIX untuk informasi terperinci tentang berbagai perbedaan.
$(...)- hanya mencatat mereka sebagai alternatif.
"the backquoted variety of command substitution is not recommended"yang hanya merupakan cara panjang untuk mengatakan IMHO usang
$(...)sebagai metode alternatif. Tidak ada bug implementasi yang dikenal dengan backticks, tetapi ada banyak bug implementasi yang diketahui $(...) . Jadi untuk masalah portabilitas, disarankan untuk menggunakan backticks untuk panggilan yang tidak bersarang. $(...)membutuhkan parser rekursif tetapi ini tidak digunakan dengan ksh86 yang memperkenalkan fitur. Periksa in-ulm.de/~mascheck/various/cmd-subst untuk daftar implementasi yang benar. Shell yang menyesuaikan harus mendukung semua kasus kecuali kasus D.2.
deprecated, misalnya penggunaan waitpid()yang mencegah Anda melihat 32 bit penuh dari exit()parameter, tetapi semua shell kecuali Bourne Shell baru-baru ini masih menggunakan waitpid()alih-alih waitid()panggilan yang sekarang tersedia sejak 26 tahun.
$(), yang lebih dijelaskan di bagian dokumentasi ini . Perbedaannya bukan hanya tentang bersarang.
Mereka berperilaku sama. Perbedaannya adalah sintaksis: lebih mudah untuk membuat sarang $()daripada ``:
listing=$(ls -l $(cat filenames.txt))
vs.
listing=`ls -l \`cat filenames.txt\``
echo $(echo \$abc)tidak sama dengan echo `echo \$abc`- Perbedaan juga ada untuk $(echo \`)dan $(echo \\)
echo foo `#comment`vs echo foo $(#comment). Yang kedua tidak berhasil. (Digunakan untuk berkomentar dalam perintah multi-line.)
Juli 2014: Komit f25f5e6 (oleh Elia Pinto ( devzero2000) , April 2014, Git 2.0) menambah masalah bersarang:
Bentuk backquoted adalah metode tradisional untuk substitusi perintah, dan didukung oleh POSIX.
Namun, semua kecuali penggunaan paling sederhana menjadi rumit dengan cepat.
Khususnya, penggantian perintah yang disematkan dan / atau penggunaan tanda kutip ganda memerlukan pelarian yang hati-hati dengan karakter backslash .
Itulah mengapa git / Documentation / CodingGuidelines menyebutkan:
Kami lebih suka
$( ... )substitusi komando; tidak seperti ``, itu benar sarang .
Seharusnya itu cara Bourne mengejanya sejak hari pertama, tapi sayangnya tidak.
Itu sebabnya
`echo `foo``tidak akan bekerja secara umum karena ambiguitas yang melekat karena masing``- masing dapat membuka atau menutup.
Mungkin berfungsi untuk kasus khusus karena keberuntungan atau fitur khusus.
Pembaruan Januari 2016: Git 2.8 (Maret 2016) sepenuhnya menghilangkan backticks.
Lihat komit ec1b763 , komit 9c10377 , komit c7b793a , komit 80a6b3f , komit 9375dcf , komit e74ef60 , komit 27fe43e , komit 2525c51 , komit becd67f , komit a5c98ac , komit 8c311f9 , komit 57da049 , komit 1d9e86f , komit 78ba28d , komit efa639f , komit 1be2fa0 , komit 38e9476 , komit 8823d2f , komit 32858a0 , komit cd914d8(12 Jan 2016) oleh Elia Pinto ( devzero2000) .
(Digabung oleh Junio C Hamano - gitster- di commit e572fef , 22 Jan 2016)
Dari Git 2.8 dan seterusnya, itu semua $(...), tidak ada lagi `...`.
$()juga ditentukan POSIX - kutipan yang menggambarkan backticks sebagai "didukung POSIX" sedemikian rupa sehingga menyiratkan bahwa ini unik bagi mereka menyesatkan. Ini hanya (era 1970-an) pra-POSIX Bourne di mana backticks adalah satu-satunya sintaks yang didukung.
Ketika bentuk centang-kembali yang lebih lama digunakan, backslash mempertahankan makna literalnya kecuali ketika diikuti oleh $, `, atau \. Centang-balik pertama yang tidak diawali dengan backslash mengakhiri substitusi perintah.
Saat menggunakan $(command)formulir yang lebih baru , semua karakter di antara tanda kurung membuat perintah; tidak ada yang diperlakukan secara khusus.
Kedua formulir dapat bersarang, tetapi variasi tanda centang kembali memerlukan formulir berikut.
`echo \`foo\``
Sebagai lawan:
$(echo $(foo))
$()versi yang sesuai dengan POSIX.
Ada sedikit perbedaan, kecuali untuk karakter yang tidak terhindar yang dapat Anda gunakan di dalam perintah. Anda bahkan dapat memasukkan perintah `...` di dalam perintah $ (...) (dan sebaliknya) untuk substitusi perintah dua tingkat yang lebih rumit.
Ada interpretasi yang sedikit berbeda dari karakter / operator backslash. Antara lain, ketika bersarang `...` perintah substitusi, Anda harus melarikan diri ` karakter dalam dengan \, sedangkan dengan substitusi $ () ia memahami sarang secara otomatis.