Substitusi perintah memungkinkan output dari suatu perintah untuk diganti di tempat nama perintah itu sendiri. Substitusi perintah akan terjadi ketika perintah terlampir sebagai berikut:
$(command)
atau (versi kutipan balik):
`command`
Shell harus memperluas substitusi perintah dengan mengeksekusi perintah
di lingkungan subkulit (lihat Lingkungan Eksekusi Shell ) dan mengganti subtitusi perintah (teks perintah ditambah "$ ()" atau tanda kutip mundur) dengan output standar dari perintah, menghapus urutan satu atau lebih <newline>
karakter di akhir substitusi. <newline>
Karakter yang disematkan sebelum akhir output tidak akan dihapus; Namun, mereka dapat diperlakukan sebagai pembatas lapangan dan dihilangkan selama pemisahan lapangan, tergantung pada nilai IFS dan kutipan yang berlaku. Jika output berisi byte nol, perilaku tidak ditentukan.
Dalam gaya substitusi komando yang dikutip kembali, <backslash>
akan mempertahankan makna literalnya, kecuali bila diikuti oleh: ' $
', ' `
', atau
<backslash>
. Pencarian untuk backquote yang cocok harus dipenuhi oleh backquote tanpa tanda kutip pertama yang tidak diloloskan; selama pencarian ini, jika backquote yang tidak diloloskan ditemui dalam komentar shell, dokumen-di sini, substitusi perintah tertanam dari formulir $ ( perintah ), atau string yang dikutip, hasil yang tidak ditentukan terjadi. String yang dikutip satu atau dua yang dimulai, tetapi tidak berakhir, dalam urutan " `...`
" menghasilkan hasil yang tidak ditentukan.
Dengan formulir $ ( perintah ), semua karakter yang mengikuti tanda kurung terbuka ke tanda kurung penutup yang cocok merupakan
perintah . Setiap skrip shell yang valid dapat digunakan untuk perintah , kecuali skrip yang hanya terdiri dari pengalihan yang menghasilkan hasil yang tidak ditentukan.
Hasil substitusi perintah tidak akan diproses untuk ekspansi tilde lebih lanjut, ekspansi parameter, substitusi perintah, atau ekspansi aritmatika. Jika substitusi perintah terjadi di dalam tanda kutip ganda, pemisahan bidang dan perluasan nama jalur tidak akan dilakukan pada hasil substitusi.
Substitusi perintah dapat disarangkan. Untuk menentukan sarang dalam versi backquoted, aplikasi harus mendahului backquote batin dengan <backslash>
karakter; sebagai contoh:
\`command\`
Sintaks bahasa perintah shell memiliki ambiguitas untuk ekspansi yang dimulai dengan "$((
", yang dapat memperkenalkan ekspansi aritmatika atau substitusi perintah yang dimulai dengan subkulit. Ekspansi aritmatika telah diutamakan; yaitu, shell pertama-tama harus menentukan apakah ia dapat menguraikan ekspansi sebagai ekspansi aritmatika dan hanya akan menguraikan ekspansi sebagai perintah substitusi jika ia menentukan bahwa ia tidak dapat mem-parsing ekspansi sebagai ekspansi aritmatika. Shell tidak perlu mengevaluasi ekspansi bersarang ketika melakukan penentuan ini. Jika ia menemui akhir input tanpa telah menentukan bahwa ia tidak dapat menguraikan ekspansi sebagai ekspansi aritmatika, shell akan memperlakukan ekspansi sebagai ekspansi aritmatika yang tidak lengkap dan melaporkan kesalahan sintaksis. Aplikasi yang sesuai harus memastikan bahwa ia memisahkan " $(
" dan '(
'menjadi dua token (yaitu, pisahkan dengan spasi putih) dalam substitusi perintah yang dimulai dengan subkulit. Misalnya, substitusi perintah yang berisi satu subkulit dapat ditulis sebagai:
$( (command) )
$()
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).