Есть два синтаксиса для подстановки команд: с долларовыми скобками и с обратными галочками. Работает top -p $(pidof init)
и top -p `pidof init`
выдает тот же вывод. Это два способа сделать одно и то же или есть различия?
Есть два синтаксиса для подстановки команд: с долларовыми скобками и с обратными галочками. Работает top -p $(pidof init)
и top -p `pidof init`
выдает тот же вывод. Это два способа сделать одно и то же или есть различия?
Ответы:
Обратные кавычки старого стиля ` `
обрабатывают обратную косую черту и вложенность немного по-другому. Новый стиль $()
интерпретирует все промежуточное ( )
как команду.
echo $(uname | $(echo cat))
Linux
echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat
работает, если вложенные обратные кавычки экранированы:
echo `uname | \`echo cat\``
Linux
удовольствие от обратной косой черты:
echo $(echo '\\')
\\
echo `echo '\\'`
\
Новый стиль $()
применяется ко всем POSIX-совместимым оболочкам.
Как указывал Мувичиэль , старый стиль ` `
может быть необходим для более старых оболочек.
Помимо технической точки зрения, старый стиль ` `
имеет и визуальный недостаток:
I like $(program) better than `program`
'`'`''`''`'`''`'
(и SE использует ` `
в своих целях, было очень тяжело писать этот ответ :)
{ }
обычно называют «фигурными скобками» или «фигурными скобками» en.wikipedia.org/wiki/Braces_(punctuation)#Braces
`
это мертвая клавиша, поэтому я должен набрать либо двойной обратный удар (что я обычно забываю, я даже могу сделать), либо обратный удар после пробела, который является боль.
Очевидное различие, которое я наблюдаю, состоит в том, что вы не можете вкладывать обратные метки, в то время как можете вкладывать $()
. Возможно, оба существуют по наследственным причинам. Точно так же .
и source
команды являются синонимами.
source
. Тире является одним из примеров.
$(...)
и `...`
являются стандартными (последний является устаревшим), в то время как .
является стандартным, но нетsource
(t)csh
они не могут быть вложенными. (t)csh
не поддерживаю $(...)
все же Они поддерживают source
(и не .
), хотя.
Еще одно примечание, $()
будет использовать больше системных ресурсов, чем использование обратных галочек, но немного быстрее.
В разделе « Освоение сценариев оболочки Unix» Рэндал К. Майкл провел тест в главе под названием «24 способа обработки файла построчно».
$()
делает ваш скрипт на один байт больше, чем если бы он использовал `
(при условии, что вы их не вкладываете и не используете обратную косую черту внутри). Что из того, что будет быстрее анализировать, будет варьироваться между оболочками и не будет иметь значения, так как незначительно по сравнению со стоимостью создания канала и разветвления процесса, что влечет за собой замену команды.
Чтобы добавить к тому, что здесь говорят другие, вы можете использовать обратные галочки для имитации встроенных комментариев:
echo foo `# I'm a comment!` bar
Выход: foo bar
.
Для получения дополнительной информации см. Следующее: https://stackoverflow.com/a/12797512 (обратите внимание также на комментарии под этим сообщением.)
$()
Синтаксис не будет работать со старой оболочкой Борна.
С новыми оболочками ` `
и $()
эквивалентны, но $()
гораздо удобнее использовать, когда вам нужно вложить несколько команд.
Например :
echo $(basename $(dirname $(dirname /var/adm/sw/save )))
легче набрать и отладить, чем:
echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``