Ada dua cara untuk menangkap output dari baris perintah di bash
:
Backticks shell Legacy Bourne
``
:var=`command`
$()
sintaks (yang sejauh yang saya tahu adalah spesifik Bash, atau setidaknya tidak didukung oleh shell lama non-POSIX seperti Bourne asli)var=$(command)
Apakah ada manfaat menggunakan sintaks kedua dibandingkan dengan backticks? Atau apakah keduanya sepenuhnya 100% setara?
$()
POSIX dan didukung oleh semua shell Bourne modern, misalnya ksh, bash, ash, dash, zsh, busybox, sebut saja. (Yang tidak begitu modern adalah Solaris/bin/sh
, tetapi pada Solaris Anda akan memastikan untuk menggunakan yang modern/usr/xpg4/bin/sh
sebagai gantinya).$()
dan backticks di alias. Jika sudah adaalias foo=$(command)
di Anda.bashrc
makacommand
akan dieksekusi ketika perintah alias itu sendiri dijalankan saat.bashrc
interpretasi. Denganalias foo=`command`
,command
akan dieksekusi setiap kali alias dijalankan. Tetapi jika Anda melarikan diri$
dengan$()
formulir (misalnyaalias foo=\$(command)
), itu juga akan mengeksekusi setiap kali alias dijalankan, alih-alih selama.bashrc
interpretasi. Sejauh yang saya tahu dari pengujian, bagaimanapun; Saya tidak dapat menemukan apa pun di bash docs yang menjelaskan perilaku ini.`command`
command
dijalankan hanya satu kali. Saya memeriksanya: function aaa () {printf date; echo aaa >> ~ / test.txt; } alias test1 =aaa
. Fungsi aaa hanya mengeksekusi satu kali (setelah setiap login) tidak peduli berapa kali alias (test1
) dieksekusi. Saya menggunakan .bashrc (di Debian 10).Jawaban:
Yang utama adalah kemampuan untuk bersarang mereka, perintah dalam perintah, tanpa kehilangan kewarasan Anda mencoba mencari tahu apakah beberapa bentuk pelarian akan bekerja pada backticks.
Contoh, meskipun agak dibuat-buat:
yang akan memberi Anda daftar semua file di
/dir
pohon direktori yang memiliki nama yang sama dengan file teks tanggal paling awal dari Desember 2011 (a) .Contoh lain adalah sesuatu seperti mendapatkan nama (bukan path lengkap) dari direktori induk:
(a) Sekarang perintah spesifik itu mungkin tidak benar-benar berfungsi, saya belum menguji fungsi. Jadi, jika Anda memilih saya untuk itu, Anda telah kehilangan pandangan :-) Ini dimaksudkan hanya sebagai ilustrasi tentang bagaimana Anda bisa bersarang, bukan sebagai cuplikan siap produksi bebas bug.
sumber
Do whatever the heck you want with it.
" :-) Bagaimanapun, saya cukup yakin itu adalah humor dari DVK.Misalkan Anda ingin menemukan direktori lib yang sesuai dengan tempat
gcc
diinstal. Anda punya pilihan:Yang pertama lebih mudah daripada yang kedua - gunakan yang pertama.
sumber
x=$(f); x=`f`
berperilaku sama denganx="$(f)"; x="`f`"
. Sebaliknya, tugas arrayx=($(f)); x=(`f`)
tidak melakukan pemisahan$IFS
karakter seperti yang diharapkan ketika menjalankan perintah. Ini nyaman (x=1 2 3 4
tidak masuk akal) tetapi tidak konsisten.x=$(f)
bekerja tanpa tanda kutip. Saya seharusnya lebih spesifik; Saya mengusulkan untuk menggunakanlibdir=$(dirname "$(dirname "$(which gcc)")")/lib
(mengutip sekitar pergantian perintah dalam ). Jika tidak kutip, Anda masih tunduk pada pemisahan kata dan ekspansi gumpalan yang biasa.Backticks (
`...`
) adalah sintaksis lama yang hanya diperlukan oleh bourne-shells tertua yang tidak kompatibel dengan$(...)
POSIX dan POSIX dan lebih disukai karena beberapa alasan:Backslash (
\
) di dalam backticks ditangani dengan cara yang tidak jelas:Mengutip bersarang di dalam
$()
jauh lebih mudah:dari pada:
atau menulis sesuatu seperti:
karena
$()
menggunakan konteks yang sama sekali baru untuk mengutipyang tidak portabel seperti cangkang Bourne dan Korn akan membutuhkan backslash ini, sedangkan Bash dan dash tidak.
Sintaks untuk pergantian perintah bersarang lebih mudah:
dari:
karena
$()
memberlakukan konteks yang sama sekali baru untuk mengutip, sehingga setiap penggantian perintah dilindungi dan dapat diperlakukan sendiri tanpa perhatian khusus pada penawaran dan pelolosan. Saat menggunakan backticks, itu menjadi lebih buruk dan lebih buruk setelah dua tingkat di atas.Beberapa contoh lagi:
Ini memecahkan masalah perilaku yang tidak konsisten saat menggunakan backquotes:
echo '\$x'
output\$x
echo `echo '\$x'`
output$x
echo $(echo '\$x')
output\$x
Sintaks Backticks memiliki batasan historis pada konten perintah yang disematkan dan tidak dapat menangani beberapa skrip yang valid yang menyertakan backquote, sementara
$()
formulir yang lebih baru dapat memproses segala jenis skrip tertanam yang valid.Misalnya, skrip tertanam yang valid ini tidak berfungsi di kolom kiri, tetapi berfungsi di IEEE kanan :
Oleh karena itu sintaks untuk substitusi perintah
$
-prefixed harus menjadi metode yang disukai, karena itu jelas secara visual dengan sintaks bersih (meningkatkan manusia dan keterbacaan mesin), itu nestable dan intuitif, penguraian bagian dalamnya terpisah, dan itu juga lebih konsisten (dengan semua ekspansi lain yang diuraikan dari dalam tanda kutip ganda) di mana backtick adalah satu-satunya pengecualian dan karakter mudah disamarkan ketika berdekatan dengan membuatnya lebih sulit untuk dibaca, terutama dengan font kecil atau tidak biasa.`
"
Sumber: Mengapa
$(...)
lebih disukai daripada`...`
(backticks)? di BashFAQLihat juga:
sumber
Dari man bash:
sumber
Selain jawaban lainnya,
menonjol secara visual lebih baik daripada
Backticks terlihat terlalu mirip apostrof; ini bervariasi tergantung pada font yang Anda gunakan.
(Dan, seperti yang baru saja saya perhatikan, backticks jauh lebih sulit untuk dimasukkan dalam sampel kode inline.)
sumber
$
(
dan)
daripada yang saya lakukan untuk backtick; YMMV.$()
memungkinkan bersarang.Saya pikir backticks tidak mengizinkannya.
sumber
out=`echo today is \`date\``
.Ini adalah standar POSIX yang mendefinisikan
$(command)
bentuk substitusi perintah. Kebanyakan cangkang yang digunakan saat ini adalah sesuai dengan POSIX dan mendukung formulir yang lebih disukai ini daripada notasi backtick kuno. Bagian substitusi perintah (2.6.3) dari dokumen Bahasa Shell menjelaskan hal ini:sumber
Ini adalah pertanyaan warisan, tapi saya datang dengan contoh sempurna valid
$(...)
atas`...`
.Saya menggunakan desktop jarak jauh untuk windows yang menjalankan cygwin dan ingin mengulangi hasil dari perintah. Sayangnya, karakter backtick tidak dapat dimasuki, baik karena desktop remote atau cygwin itu sendiri.
Sangat masuk akal untuk berasumsi bahwa tanda dolar dan tanda kurung akan lebih mudah untuk diketik dalam pengaturan aneh seperti itu.
sumber