Чтобы сохранить вывод команды как переменную в sh / ksh / bash, вы можете сделать
var=$(command)
или
var=`command`
Какая разница между этими двумя методами?
Чтобы сохранить вывод команды как переменную в sh / ksh / bash, вы можете сделать
var=$(command)
или
var=`command`
Какая разница между этими двумя методами?
Ответы:
Обратные пометки / надписи были объявлены устаревшими в пользу $()
подстановки команд, потому что они $()
могут легко вкладываться в себя, как в $(echo foo$(echo bar))
. Существуют и другие различия, такие как анализ обратной косой черты в версии backtick / gravemark и т. Д.
См. BashFAQ / 082 по нескольким причинам, чтобы всегда отдавать предпочтение синтаксису $ (...).
Также см. Спецификацию POSIX для получения подробной информации о различных различиях.
$(...)
- он просто отмечает их как альтернативы.
"the backquoted variety of command substitution is not recommended"
что это просто
$(...)
как альтернативный метод. Нет известных ошибок реализации с обратными галочками, но есть много известных ошибок реализации с $(...)
. Так что для проблем переносимости рекомендуется использовать обратные галочки для не вложенных вызовов. $(...)
нужен рекурсивный синтаксический анализатор, но он не использовался с ksh86, который представил эту функцию. Проверьте in-ulm.de/~mascheck/various/cmd-subst для списка правильных реализаций. Соответствующая оболочка должна поддерживать все случаи, кроме случая D.2.
deprecated
, например, использование waitpid()
которых мешает вам видеть полные 32 бита из exit()
параметра, но все оболочки, кроме недавней оболочки Bourne, все еще используют waitpid()
вместо waitid()
вызова, который теперь доступен, так как 26 лет
$()
, что более подробно описано в этой части документации . Разница не только во вложении.
Они ведут себя одинаково. Разница синтаксическая: вкладывать проще, $()
чем ``
:
listing=$(ls -l $(cat filenames.txt))
против
listing=`ls -l \`cat filenames.txt\``
echo $(echo \$abc)
это не то же самое, что echo `echo \$abc`
- Различия также существуют для $(echo \`)
и $(echo \\)
echo foo `#comment`
против echo foo $(#comment)
. Второй не работает. (Используется для комментирования в многострочной команде.)
Июль 2014: коммит f25f5e6 (от Elia Pinto ( devzero2000
) , апрель 2014, Git 2.0) добавляет к проблеме с вложенностью:
Форма с кавычками является традиционным методом подстановки команд и поддерживается POSIX.
Тем не менее, все, кроме простейшего использования быстро усложняются.
В частности, встроенные подстановки команд и / или использование двойных кавычек требуют осторожного экранирования с символом обратной косой черты .
Вот почему Git / Documentation / CodingGuidelines упоминает:
Мы предпочитаем
$( ... )
замену команд; в отличие от ``, он правильно вложен .
Это должно было быть так, как Борн написал с первого дня, но, к сожалению, это не так.
Вот почему
`echo `foo``
не будет работать вообще из-за присущей ему неоднозначности, потому что каждый``
может быть открывающим или закрывающим.
Это может работать для особых случаев из-за удачи или специальных функций.
Обновление от января 2016 года: Git 2.8 (март 2016 года) полностью избавился от недостатков.
См совершать ec1b763 , совершать 9c10377 , совершают c7b793a , совершают 80a6b3f , совершают 9375dcf , совершают e74ef60 , совершают 27fe43e , совершают 2525c51 , совершают becd67f , совершают a5c98ac , совершают 8c311f9 , совершают 57da049 , совершают 1d9e86f , совершают 78ba28d , совершают efa639f , совершают 1be2fa0 , совершить 38e9476 , коммит 8823d2f , коммит 32858a0 , коммит cd914d8(12 января 2016 г.) Элия Пинто ( devzero2000
) .
(Объединено Junio C Hamano - gitster
- в коммите e572fef , 22 января 2016 г.)
Начиная с Git 2.8, это все $(...)
, не более `...`
.
$()
также указывается POSIX - цитата, которая описывает обратные пометки как «поддерживаемые POSIX» таким образом, что подразумевает, что это уникально для них, вводит в заблуждение. Это только (эпоха 1970-х) pre-POSIX Bourne, где обратные помехи являются единственным поддерживаемым синтаксисом.
Когда используется более старая форма обратной галочки, обратная косая черта сохраняет свое буквальное значение, за исключением случаев, когда следуют $, `или \. Первый обратный тик, которому не предшествует обратный слеш, завершает подстановку команды.
При использовании более новой $(command)
формы все символы в скобках составляют команду; никто не лечится специально.
Обе формы могут быть вложенными, но для разновидности обратного тика требуется следующая форма.
`echo \`foo\``
В отличие от:
$(echo $(foo))
$()
версия соответствуют POSIX.
Существует небольшая разница, за исключением того, какие символы без экранирования вы можете использовать внутри команды. Вы можете даже поместить команды `...` внутри $ (...) (и наоборот) для более сложной двухуровневой подстановки команд.
Существует немного другая интерпретация символа / оператора обратной косой черты. Среди прочего, при вложении команд подстановки `...` вы должны экранировать внутренние символы ` с помощью \, тогда как при подстановке $ () он автоматически распознает вложенность.