Подстановка команд позволяет подставить вывод команды вместо самого имени команды. Подстановка команды должна происходить, если команда заключена следующим образом:
$(command)
или (версия с обратной кавычкой):
`command`
Оболочка расширяет подстановку команд, выполняя command в среде подоболочки (см. Shell Execution Environment) и заменив подстановку команды (текст command плюс заключительный "$ ()" или обратные кавычки) стандартным выводом команды, удаление последовательностей из одного или нескольких символов <newline>
в конце подстановки. Встроенные символы <newline>
перед концом вывода не удаляются; однако они могут рассматриваться как разделители полей и устраняться при разделении полей, в зависимости от действующего значения IFS и цитирования. Если вывод содержит какие-либо нулевые байты, поведение не определено.
В стиле подстановки команд в обратных кавычках <backslash>
должен сохранять свое буквальное значение, за исключением случаев, когда за ним следуют: '$
', '`
' или <backslash>
. Поиск совпадающей обратной кавычки должен удовлетворяться первой не заключенной в кавычки обратной кавычкой без экранирования; во время этого поиска, если обратная кавычка без экранирования встречается в комментарии оболочки, здесь-документе, встроенной подстановке команд в форме $ (command) или в строке в кавычках, появляются неопределенные результаты. Строка в одинарных или двойных кавычках, которая начинается, но не заканчивается в последовательности «`...`
», дает неопределенные результаты.
В форме $ (command) все символы, следующие за открывающей круглой скобкой до соответствующей закрывающей круглой скобки, составляют команду. Для command можно использовать любой допустимый сценарий оболочки, кроме сценария, состоящего исключительно из перенаправлений, дающих неопределенные результаты.
Результаты подстановки команд не должны обрабатываться для дальнейшего раскрытия тильды, раскрытия параметров, подстановки команд или арифметического раскрытия. Если подстановка команды происходит внутри двойных кавычек, разделение полей и раскрытие имени пути не должно выполняться для результатов подстановки.
Подстановка команд может быть вложенной. Чтобы указать вложенность в версии с обратными кавычками, приложение должно предварять внутренние обратные кавычки символами <backslash>
; Например:
\`command\`
Синтаксис командного языка оболочки неоднозначен для расширений, начинающихся с «$((
», что может вводить арифметическое раскрытие или подстановку команд, начинающуюся с подоболочки. Арифметическое расширение имеет приоритет; то есть оболочка сначала должна определить, может ли она анализировать раскрытие как арифметическое раскрытие, и должна анализировать расширение как подстановку команды только в том случае, если она определяет, что она не может анализировать раскрытие как арифметическое раскрытие. При выполнении этого определения оболочке не нужно оценивать вложенные расширения. Если он встречает конец ввода, еще не определив, что он не может проанализировать расширение как арифметическое расширение, оболочка должна рассматривать раскрытие как неполное арифметическое раскрытие и сообщать о синтаксической ошибке. Соответствующее приложение должно гарантировать, что оно разделяет «$(
» и «(
» на два маркера (то есть разделяет их пробелом) в подстановке команд, которая начинается с подоболочки. Например, подстановка команды, содержащая одну подоболочку, может быть записана как:
$( (command) )
$()
является POSIX и поддерживается всеми современными оболочками Борна, например ksh, bash, ash, dash, zsh, busybox, что угодно. (Не такой современный - Solaris/bin/sh
, но в Solaris вы должны использовать вместо него современный/usr/xpg4/bin/sh
). - person Jens   schedule 17.05.2012$()
и обратных кавычек в псевдонимах. Если у вас естьalias foo=$(command)
в вашем.bashrc
, тоcommand
будет выполняться при запуске самой команды псевдонима во время интерпретации.bashrc
. Сalias foo=`command`
,command
будет выполняться каждый раз при запуске псевдонима. Но если вы экранируете$
с формой$()
(например,alias foo=\$(command)
), он тоже будет выполняться каждый раз при запуске псевдонима, а не во время интерпретации.bashrc
. Во всяком случае, насколько я могу судить по тестированию; Я не могу найти в документации bash ничего, что объясняло бы такое поведение. - person dirtside   schedule 27.02.2014`command`
command
выполняется только один раз. Я проверил: function aaa () {printf date; echo aaa ›› ~ / test.txt; } псевдоним test1 =aaa
. Функция aaa выполняется только один раз (после каждого входа в систему) независимо от того, сколько раз выполнялся псевдоним (test1
). Я использовал .bashrc (в Debian 10). - person vitaliydev   schedule 18.09.2019