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

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

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

echo "Hello, `whoami`." 

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

 echo "Hello, $(whoami)." 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    -B.

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


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

     $ echo $(echo hello $(echo word)) hello word $ echo `echo hello \`echo word\`` hello word 

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

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

    Interesting Posts

    Каковы новые слова «for», «at», «in» в объявлениях Swift3?

    Где результаты chkdsk, расположенные в Windows 7?

    Удалить определенное имя файла в нескольких ZIP-файлах

    Как создать пользователя SSH, у которого есть разрешение на доступ к определенным папкам в Ubuntu?

    При использовании @EJB каждый управляемый bean-компонент получает свой собственный экземпляр @EJB?

    Создайте защищенный паролем файл excel с помощью apache poi?

    VT-x / AMD-V Work-Around для VirtualBox?

    Внедрение архитектуры плагинов / системы плагинов / сменных фреймов в Angular 2, 4, 5, 6

    Шифрование полного диска Mac OS X, с Time Machine

    Как гарантировать порядок оценки аргументов при вызове функционального объекта?

    Ошибка в файле styles_base.xml – приложение для Android – Ресурс не найден, который соответствует указанному имени ‘android: Widget.Material.ActionButton’

    Как сделать двоичную разницу двух файлов одинакового размера в Linux?

    onPageFinished () никогда не вызывал (webview)!

    Где установлены приложения из Windows Store?

    Обращение с ARM TrustZones

    Давайте будем гением компьютера.