Команда подстановки: обратные кавычки или знак доллара / парень закрытый? [дубликат]


этот вопрос уже есть ответ здесь:

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

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

echo "Hello, `whoami`."

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

echo "Hello, $(whoami)."

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

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

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

сторону вопрос: это плохая практика, чтобы использовать и формы в одном скрипте, например при вложении командных подстановок?

3 141

3 ответа:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

для получения дополнительной информации по теме замены команд и двух различных форм для этого я предлагаю вам обратиться к разделу о замене команд в книге О'Рейли "классический сценарий оболочки", второе издание, Роббинс и Биб. В этом разделе авторы заявляют, что форма POSIX для замены команд "рекомендуется для всех новых разработок." Я у меня нет финансового интереса к этой книге; это всего лишь один из моих сценариев (и любовь) к сценариям оболочки, хотя это больше для промежуточных или продвинутых сценариев оболочки, а не для начинающих сценариев оболочки.

- B.

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


одна вещь, чтобы отметить, что вы должны бежать backquote чтобы вложенные команды:

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

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

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

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