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

Каков предпочтительный способ выполнить подстановку команд в 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

    Заставить программу на x86?

    0 – десятичный литерал или восьмеричный литерал?

    CUDA несовместим с моей версией gcc

    Добавление нескольких изображений в один файл PDF с помощью iText с использованием java

    Почему мои расширения Chrome, возможно, были повреждены?

    В чем разница между выбранными, проверенными и активированными в Android состояниями?

    Отладка нерабочего командного файла или команды, выполняемой установщиком Inno Setup

    Посмотрите, вызван ли метод внутри метода с использованием отражения

    Формат даты Сопоставление с JSON Jackson

    Как (* SKIP) или (* F) работают над регулярным выражением?

    Где хранятся файлы физического шрифта?

    Как я могу скопировать большой файл с одной машины Windows на другую предельную скорость передачи?

    Не удается получить местоположение и электронную почту с помощью API Facebook

    Как получить строку MAX с запросом GROUP BY в LINQ?

    Панель состояния iOS 7 возвращается к стилю iOS 6 по умолчанию в приложении iPhone?

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