Команда подстановки: обратные кавычки или знак доллара / парень закрытый? [дубликат]
этот вопрос уже есть ответ здесь:
каков предпочтительный способ сделать замену команд в bash?
Я всегда делал так:
echo "Hello, `whoami`."
но в последнее время, я часто видел его написано так:
echo "Hello, $(whoami)."
каков предпочтительный синтаксис и почему? Или они взаимозаменяемы?
Я склоняюсь к первому, просто потому, что мой текстовый редактор, похоже, знает, что это такое, и делает подсветку синтаксиса соответствующим образом.
я прочитала здесь что экранированные символы действуют немного по-разному в каждом случае, но мне не ясно, какое поведение предпочтительнее, или если это просто зависит от ситуации.
сторону вопрос: это плохая практика, чтобы использовать и формы в одном скрипте, например при вложении командных подстановок?
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