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

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

250 голосов | спросил Tshepang 13 Jpm1000000pmThu, 13 Jan 2011 14:02:56 +030011 2011, 14:02:56

6 ответов


339

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

echo $ (uname | $ (echo cat))
Linux

echo `uname | `echo cat``
bash: подстановка команды: строка 2: синтаксическая ошибка: неожиданный конец файла
эхо-кошка

работает, если скрытые backquotes экранированы:

echo `uname | \ echo cat \ ``
Linux

обратная косая черта:

echo $ (echo '\\')
\\

echo `echo '\\'`
\

Новый стиль $ () применяется ко всем POSIX -конформные оболочки.
Как отмечалось в mouviciel , в старом стиле `` может потребоваться для старых оболочек.

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

  • Трудно заметить: Мне нравится $ (program) лучше, чем `program`
  • Легко путать с одной цитатой: '`` `' '' ''` `` `` `'
  • Не так легко напечатать (возможно, даже не на стандартном макете клавиатуры)

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

ответил wag 13 Jpm1000000pmThu, 13 Jan 2011 14:30:36 +030011 2011, 14:30:36
40

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

ответил balki 13 Jpm1000000pmThu, 13 Jan 2011 14:17:14 +030011 2011, 14:17:14
27

$ () не работает со старой оболочкой Bourne. Но прошло много лет с тех пор, как я работал со старой оболочкой Борна.

ответил mouviciel 13 Jpm1000000pmThu, 13 Jan 2011 17:38:58 +030011 2011, 17:38:58
5

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

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

ответил cuonglm 7 J0000006Europe/Moscow 2013, 23:43:41
2

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

echo foo `# Я - комментарий!` bar

Вывод: foo bar.

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

ответил phk 2 FriEurope/Moscow2016-12-02T12:31:34+03:00Europe/Moscow12bEurope/MoscowFri, 02 Dec 2016 12:31:34 +0300 2016, 12:31:34
0

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

Например:

echo $ (basename $ (dirname $ (dirname /var /adm /sw /save)))

легче печатать и отлаживать, чем:

echo `basename \` dirname \\\ `dirname /var /adm /sw /save \\\` \ ``
ответил Emmanuel 19 FebruaryEurope/MoscowbWed, 19 Feb 2014 16:36:24 +0400000000pmWed, 19 Feb 2014 16:36:24 +040014 2014, 16:36:24

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132