it-swarm-ru.tech

В чем разница между $ (вещи) и `вещи`?

Существует два синтаксиса для подстановки команд: с долларовыми скобками и с помощью обратных кавычек. Запуск top -p $(pidof init) и ​​top -p `pidof init` дает тот же вывод. Это два способа сделать одно и то же или есть различия?

270
tshepang

Обратные кавычки старого стиля _` `_ обрабатывают обратную косую черту и вложение немного по-другому. Новый стиль $() интерпретирует все, что находится между _( )_, как команду.

_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 - совместимым оболочкам.
Как указано mouviciel , старый стиль _` `_ может быть необходим для старых оболочек.

Помимо технической точки зрения, старый стиль _` `_ имеет также визуальный недостаток:

  • Трудно заметить: I like $(program) better than `program`
  • Легко спутать с одной цитатой: _'`'`''`''`'`''`'_
  • Не так просто печатать (возможно даже не на стандартной раскладке клавиатуры)

(и SE использует _` `_ для своих целей, было очень сложно написать этот ответ :)

364
wag

Очевидное отличие, которое я наблюдаю, состоит в том, что вы не можете вкладывать обратные метки, в то время как вы можете вкладывать $(). Возможно, оба существуют по наследственным причинам. Аналогично команды . И source являются синонимами.

41
balki

$() не работает со старой оболочкой Bourne. Но это было лет десятилетия с тех пор, как я работал со старой Bourne Shell.

28
mouviciel

Еще одно замечание: $() будет использовать больше системных ресурсов, чем использование обратных галочек, но немного быстрее.

В Освоение сценариев Unix Shell Рэндал Майкл провел тест в главе под названием "24 способа построчной обработки файла".

6
cuonglm

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

echo foo `# I'm a comment!` bar

Вывод: foo bar.

Для получения дополнительной информации см. Следующее: https://stackoverflow.com/a/12797512 (Обратите внимание также на комментарии под этим сообщением.)

5
phk

Синтаксис $() не будет работать со старой оболочкой Bourne.
С более новыми оболочками _` `_ и $() эквивалентны, но $() гораздо удобнее использовать, когда вам нужно вложить несколько команд.

Например :

_echo $(basename $(dirname $(dirname /var/adm/sw/save )))
_

легче набрать и отладить, чем:

_echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``
_
1
Emmanuel