Есть два способа получить выходные данные командной строки bash
:
Задняя часть корпуса Bourne
``
:var=`command`
$()
синтаксис (который, насколько я знаю, специфичен для Bash, или, по крайней мере, не поддерживается старыми оболочками, отличными от POSIX, такими как оригинальный Bourne)var=$(command)
Есть ли польза от использования второго синтаксиса по сравнению с обратными чертами? Или два полностью 100% эквивалентны?
$()
это POSIX и поддерживается всеми современными оболочками Bourne, например, ksh, bash, ash, dash, zsh, busybox, как вы его называете. (Не очень современный - Solaris/bin/sh
, но/usr/xpg4/bin/sh
вместо него вы должны использовать современный ).$()
и обратных кавычек в псевдонимах. Если у вас естьalias foo=$(command)
в вашем.bashrc
тогдаcommand
будет выполняться , когда команда псевдоним сам запускается во время.bashrc
интерпретации. Сalias foo=`command`
,command
будет выполняться каждый раз при запуске псевдонима. Но если вы избежать$
с$()
формой (напримерalias foo=\$(command)
), он тоже будет выполняться каждый раз , когда псевдоним запуска, а не во время.bashrc
интерпретации. Во всяком случае, насколько я могу судить по тестированию; Я не могу найти ничего в документах Bash, которые объясняют это поведение.`command`
command
выполняется только один раз. Я проверил это: function aaa () {printf date; echo aaa >> ~ / test.txt; } alias test1 =aaa
. Функция aaa выполняется только один раз (после каждого входа в систему) независимо от того, сколько разtest1
был выполнен alias ( ). Я использовал .bashrc (на Debian 10).Ответы:
Основным из них является возможность вкладывать их, команды внутри команд, не теряя при этом здравомыслия, пытаясь выяснить, сработает ли какая-либо форма побега на задних ходах.
Пример, хотя и несколько надуманный:
который предоставит вам список всех файлов в
/dir
дереве каталогов, которые имеют то же имя, что и самый ранний текстовый файл с датой от декабря 2011 года (а) .Другим примером может быть получение имени (а не полного пути) родительского каталога:
(а) Теперь, когда конкретная команда может не работать, я не проверял функциональность. Так что, если вы проголосуете за меня, вы упустили из виду намерение :-) Это всего лишь иллюстрация для иллюстрации того, как вы можете вкладывать, а не как готовый к использованию фрагмент без ошибок.
источник
Do whatever the heck you want with it.
» :-) В любом случае, я уверен, что это был юмор от ДВК.Предположим, вы хотите найти каталог lib, соответствующий месту
gcc
установки. У вас есть выбор:Первый легче второго - используйте первый.
источник
x=$(f); x=`f`
вести себя так же, какx="$(f)"; x="`f`"
. В отличие от этого , присваивание массиваx=($(f)); x=(`f`)
делают производить разбиение на$IFS
символы , как ожидается , при вызове команды. Это удобно (x=1 2 3 4
не имеет смысла), но противоречиво.x=$(f)
работы без кавычек. Я должен был быть более конкретным; Я предлагал использоватьlibdir=$(dirname "$(dirname "$(which gcc)")")/lib
(кавычки вокруг внутренних подстановок команд). Если оставить его без кавычек, вы все равно будете подвергаться обычному расщеплению слов и расширению глобуса.Backticks (
`...`
) - это унаследованный синтаксис, который требуется только самым старым из не POSIX-совместимых bourne-shell. Он$(...)
является POSIX и более предпочтителен по нескольким причинам:Обратные косые черты (
\
) внутри обратных кавычек обрабатываются неочевидным способом:Вложенное цитирование внутри
$()
гораздо удобнее:вместо того:
или писать что-то вроде:
потому что
$()
использует совершенно новый контекст для цитированиякоторый не является переносимым, так как оболочкам Борна и Корна потребуются эти обратные слеши, в то время как Bash и dash не требуют.
Синтаксис для вложения подстановок команд проще:
чем:
потому что
$()
обеспечивает совершенно новый контекст для цитирования, поэтому каждая подстановка команд защищена и может обрабатываться сама по себе без особой заботы о цитировании и экранировании. При использовании обратных галочек становится все уродливее и уродливее после двух и выше уровней.Еще несколько примеров:
Это решает проблему противоречивого поведения при использовании обратных кавычек:
echo '\$x'
выходы\$x
echo `echo '\$x'`
выходы$x
echo $(echo '\$x')
выходы\$x
Синтаксис Backticks имеет исторические ограничения на содержание встроенной команды и не может обрабатывать некоторые допустимые сценарии, которые включают в себя обратные кавычки, в то время как более новая
$()
форма может обрабатывать любые допустимые встроенные сценарии.Например, эти действительные встроенные сценарии не работают в левом столбце, но работают в правом IEEE :
Поэтому синтаксис для
$
подстановки команд с префиксом должен быть предпочтительным методом, потому что он визуально понятен с чистым синтаксисом (улучшает удобочитаемость для человека и машины), он является вложенным и интуитивно понятным, его внутренний анализ является отдельным, и он также более согласован (с все другие расширения, которые анализируются из двойных кавычек), где обратные пометки являются единственным исключением, а`
символ легко маскируется, когда его рядом, что"
делает его еще более трудным для чтения, особенно с маленькими или необычными шрифтами.Источник: Почему
$(...)
предпочтительнее`...`
(backticks)? на BASFAQСмотрите также:
источник
От человека Баш:
источник
В дополнение к другим ответам,
визуально лучше, чем
Обратные пальцы слишком похожи на апострофы; это зависит от используемого вами шрифта.
(И, как я только что заметил, обратные метки намного сложнее вводить во встроенные примеры кода.)
источник
$
(
и)
чем у меня спина; YMMV.$()
позволяет вложение.Я думаю, что backticks не позволяет это.
источник
out=`echo today is \`date\``
.Это стандарт POSIX, который определяет
$(command)
форму подстановки команд. Большинство оболочек, используемых сегодня, являются POSIX-совместимыми и поддерживают эту предпочтительную форму по сравнению с архаичной нотацией обратного удара. Раздел подстановки команд (2.6.3) документа Shell Language описывает это:источник
Это унаследованный вопрос, но я придумал вполне обоснованный пример
$(...)
завершения`...`
.Я использовал удаленный рабочий стол для окон под управлением Cygwin и хотел перебрать результат команды. К сожалению, вводный символ был невозможен из-за удаленного рабочего стола или самого Cygwin.
Разумно предположить, что знак доллара и скобки будет легче вводить в таких странных настройках.
источник