Замена команды: обратные ссылки или знак доллара/парад заключены?

Какой предпочтительный способ выполнить подстановку команд в bash?

Я всегда делал это так:

echo "Hello, `whoami`."

Но в последнее время я часто видел, как это написано так:

echo "Hello, $(whoami)."

Какой предпочтительный синтаксис и почему? Или они в значительной степени взаимозаменяемы?

Я предпочитаю первое, просто потому, что мой текстовый редактор, похоже, знает, что это такое, и делает подсветку синтаксиса соответствующим образом.

Я читаю здесь, что экранированные символы действуют по-разному в каждом случае, но мне непонятно, какое поведение предпочтительнее или просто зависит от ситуации.

Боковой вопрос: плохо ли использовать обе формы в одном script, например, при вставке подстановок команд?

Ответ 1

Здесь есть несколько вопросов/проблем, поэтому я повторяю каждый раздел текста плаката, цитируемый кадром и сопровождаемый моим ответом.

Какой предпочтительный синтаксис и почему? Или они в значительной степени взаимозаменяемы?

Я бы сказал, что форма $(some_command) предпочтительнее формы `some_command`. Вторая форма, использующая пару backquotes (символ "`", также называемый обратным ходом и серьезным акцентом), является историческим способом ее выполнения. Первая форма, использующая знак доллара и круглые скобки, представляет собой более новую форму POSIX, что означает, что это, вероятно, более стандартный способ ее выполнения. В свою очередь, я думаю, что это означает, что он с большей вероятностью корректно работает с разными оболочками и с различными реализациями nix.

Другая причина, заданная для предпочтения первой (POSIX) формы, состоит в том, что ее легче читать, особенно когда вставки команд вложены. Кроме того, с формой обратного хода символы обратного следа должны быть обратными слэшами во вложенных (внутренних) командных подстановках.

В форме POSIX вам не нужно это делать.

Насколько они взаимозаменяемы, я бы сказал, что, в общем, они взаимозаменяемы, кроме исключений, которые вы упомянули для экранированных символов. Тем не менее, я не знаю и не могу сказать, поддерживают ли все современные раковины и все современные ножи обеими формами. Я сомневаюсь, что они это делают, особенно старые раковины/более старые * nixes. Если бы я был вами, я бы не стал зависеть от взаимозаменяемости, не выполнив сначала несколько простых простых тестов каждой формы в любых реализациях shell/* nix, на которых вы планируете запускать готовые скрипты.

Я предпочитаю первое, просто потому, что мой текстовый редактор, похоже, знает, что это такое, и делает подсветку синтаксиса соответствующим образом.

Несчастливо, что ваш редактор, похоже, не поддерживает форму POSIX; возможно, вы должны проверить, есть ли обновление для вашего редактора, поддерживающего способ POSIX. Возможно, длинный выстрел, но кто знает? Или, может быть, вам стоит подумать о том, чтобы попробовать другой редактор.

GGG, какой текстовый редактор вы используете?

Я читаю здесь, что экранированные символы действуют по-разному в каждом случае, но мне не ясно, какое поведение предпочтительнее или просто зависит от ситуации.

Я бы сказал, что это зависит от того, что вы пытаетесь выполнить; другими словами, используете ли вы экранированные символы вместе с подстановкой команд или нет.

Боковой вопрос: плохо ли использовать обе формы в одном script, например, при вставке подстановок команд?

Ну, это может сделать script немного легче ПРОЧИТАТЬ (типографически говоря), но сложнее ПОНИМАТЬ! Кто-то читает ваш script (или вы, читаете его шесть месяцев спустя!), Вероятно, будет удивляться, почему вы не просто придерживаетесь одной или другой формы - если не указать какую-то заметку о том, почему вы сделали это в комментариях, Кроме того, смешивание обеих форм в одном script приведет к тому, что script будет менее переносимым: для правильной работы script, оболочка, которая его выполняет, должна поддерживать формы BOTH, а не только одну форму или другие.

Для того, чтобы сделать оболочку script понятной, я лично предпочел бы придерживаться одной или другой формы на любом из script, если нет хорошей технической причины для этого. Более того, я предпочел бы форму POSIX поверх старой формы; опять же, если нет хорошей технической причины для этого.

Подробнее о теме подстановки команд и двух разных формах для этого, я предлагаю вам обратиться к разделу подстановки команд в книге O'Reilly "Классическая оболочка Scripting", второе издание, Robbins and Beebe, В этом разделе авторы заявляют, что форма POSIX для подстановки команд "рекомендуется для всех новых разработок". У меня нет финансовой заинтересованности в этой книге; это только один, который у меня есть (и любовь) на сценариях оболочки, хотя он больше подходит для промежуточных или расширенных сценариев оболочки, а не для начала сценариев оболочки.

-B.

Ответ 2

Вы можете прочитать отличия от bash manual. В большинстве случаев они взаимозаменяемы.


Следует отметить, что вы должны избегать backquote для вложения команд:

$ echo $(echo hello $(echo word))
hello word    

$ echo `echo hello \`echo word\``
hello word

Ответ 3

Backticks совместимы с древними оболочками, поэтому сценарии, которые должны быть переносимыми (например, фрагменты GNU autoconf), должны их предпочесть.

Форма $() немного легче на глазах, особенно. после нескольких уровней ускорения.