Насколько я понимаю, более современный $(...)
синтаксис подстановки команд предпочтительнее старого `
синтаксиса из-за более простого и менее подверженного ошибкам вложения и экранирования синтаксиса.
Кроме того, кажется, что большинство /bin/sh
оболочек в современном стиле поддерживают $(…)
:
- удар
- Ash (и, следовательно, BusyBox, поэтому большинство встроенных Linux)
- тире
- FreeBSD / bin / sh
И $(…)
определено IEEE 1003.1.
Итак, у меня есть 2 очень связанных вопроса:
- Есть ли какая-либо причина использовать `в новой разработке сценариев оболочки, если вы не знаете конкретную старую систему, на которой сценарий должен будет выполняться?
- Есть ли какая-либо причина не учить студентов по программированию на UNIX просто писать
$(...)
, а обсуждать`
только как устаревший вариант, с которым они, вероятно, столкнутся, если будут читать сценарии оболочки других разработчиков (и может понадобиться, если они работают с действительно старой или нестандартной системой)? по какой-то причине)?
shell
command-substitution
Майкл Экстранд
источник
источник
`...`
. Он существует для обратной переносимости только с оболочкой Борна (как и в случае с оболочкой Борна^
(так же, как|
) для обратной переносимости с оболочкой Томсона). Обратите внимание, что(t)csh
у них нет$(...)
(но нет особого смысла использовать или учить их).$()
- сдвиг + 4,9, сдвиг + 0 - 5 нажатий клавиш;Ответы:
Поскольку часто используются обратные тики, имеет смысл обучать этой синтаксической конструкции.
Конечно,
$()
подстановка команды стиля должна быть подчеркнута как стиль по умолчанию (и стандартная соответствующая конструкция).Почему бэк-тики все еще популярны? Потому что они сохраняют один символ при наборе текста и, возможно, менее тяжелы для глаз.
источник
$()
лучше, но неприятные ощущения легче и больше ПОЦЕЛУЮ; может быть следствием общего программирования.`
является Altrg + è (неудобным типа), в то время как$
,(
,)
не нужно никакого модификатора.Я не стал бы использовать их для программирования, и обучение использованию замены backtick в сценариях оболочки, как устаревших, прекрасно (это, кажется, консенсус). Однако я не думаю, что они изначально злые, и (по крайней мере, судя по вашему обычному руководству по командной строке Linux) они все еще часто используются в простых фрагментах / однострочниках, где они, вероятно, не будут вложенными, и тому подобное. собираешься делать только один раз.
См. Подстановка команд: кавычки или знак доллара / парен прилагается? ,
источник
Я избегаю использовать
$()
конструкцию, потому что она не переносима - в реальном мире. Вы перечислили четыре оболочки - вариантов гораздо больше, чем вокруг (на порядок?). Попробуйте запустить свой скрипт в Solaris / bin / sh и посмотрите, как вы это делаете.С другой стороны, когда вы прекращаете поддерживать старые системы? Вы никогда не сможете перейти к новым способам ведения дел? Я считаю, что вы должны доверять своему собственному суждению, и если вы можете увидеть определенное преимущество нового пути над старым, то пойдите на это ... это не один из них (лично я считаю, что бактики намного яснее - они не могут быть путать с подстановкой переменных оболочки, что другое дело)
источник
/bin/sh
должно соответствовать. Solaris/bin/sh
действительно очень несоответствующий - хотя Solaris 9/10 / ... официально соответствует POSIX. Это$()
только одна конструкция, которую он не понимает. Но есть еще много чего он не понимает или интерпретируется по-разному. Портативный способ получить соответствующийsh
для поиска в пути, возвращаемомgetconf PATH
.