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