Підстановка команд дозволяє замінити результат команди замість самої назви команди. Заміна команди відбувається, коли команда додається наступним чином:
$(command)
або (зворотна версія):
`command`
Оболонка повинна розширювати підстановку команд, виконуючи команду
в середовищі підрозділу (див. Середовище виконання оболонки ) і замінюючи заміну команди (текст команди плюс додається "$ ()" або зворотні котирування) на стандартний вихід команди, видаляючи послідовності одного або декількох <newline>
символів в кінці підстановки. Вбудовані <newline>
символи до кінця виводу не видаляються; однак вони можуть розглядатися як роздільники поля та усуватися під час розбиття поля, залежно від значення IFS та котирування, що діє. Якщо вихід містить будь-які нульові байти, поведінка не визначено.
У стилі підстановки команд, що <backslash>
запам'ятовується, він зберігає своє буквальне значення, за винятком випадків, коли слідує: ' $
', ' `
' або
<backslash>
. Пошук відповідного зворотного котирування повинен задовольнятися першим незапропонованим цитатам, що не залишилося цитатами; під час цього пошуку, якщо в коментарі оболонки зустрічається невідбутесь зворотне котирування, виникає документ тут, вбудована командна заміна форми $ ( command ) або рядка, що цитується, не визначені результати. Рядок з одноцитованим або подвійним цитуванням, який починається, але не закінчується, в " `...`
" послідовності створює невизначені результати.
У формі $ ( команда ) всі символи, що слідують за відкритими дужками до відповідних дужок, що закриваються, складають
команду . Будь-який дійсний скрипт оболонки може використовуватися для команди , за винятком сценарію, що складається виключно з перенаправлень, які дають не визначені результати.
Результати заміни команд не обробляються для подальшого розширення тильди, розширення параметрів, підстановки команд або арифметичного розширення. Якщо підміна команди відбувається всередині подвійних лапок, розбиття полів та розширення імені шляху за результатами заміни не проводиться.
Заміна команд може бути вкладена. Щоб вказати вкладення у версії з котируванням, програма повинна передувати внутрішнім зворотним котируванням із <backslash>
символами; наприклад:
\`command\`
Синтаксис команди команди оболонки має неоднозначність для розширень, починаючи з "$((
", який може ввести арифметичне розширення або заміну команд, що починається з підшару. Арифметичне розширення має перевагу; тобто оболонка спочатку визначає, чи може вона розбирати розширення як арифметичне розширення, і розбирає розширення лише як команду заміщення, якщо він визначає, що він не може аналізувати розширення як арифметичне розширення. Оболонці не потрібно оцінювати вкладені розширення при виконанні цього визначення. Якщо він стикається з кінцем вводу, не визначивши, що він не може аналізувати розширення як арифметичне розширення, оболонка розглядає розширення як неповне арифметичне розширення та повідомляє про синтаксичну помилку. Відповідна програма повинна гарантувати, що вона відокремлює "$(
" та "(
'на два лексеми (тобто розділіть їх пробілом) у підстановці команд, яка починається з підшару. Наприклад, заміна команди, що містить одну підшару, може бути записана як:
$( (command) )
$()
є POSIX і підтримується всіма сучасними оболонками Bourne, наприклад, ksh, bash, ash, dash, zsh, busybox, ви його називаєте. (Не таким сучасним є Solaris/bin/sh
, але на Solaris ви б обов'язково/usr/xpg4/bin/sh
замість цього використовували сучасний ).