В чем разница между $ (stuff) и `stuff`?
Существует два синтаксиса для подстановки команд: с круглыми скобками в долларах и с обратными окнами.
Выполнение top -p $ (pidof init)
и top -p `pidof init`
дает тот же результат. Эти два способа сделать одно и то же, или есть различия?
6 ответов
Предыдущие обратные кавычки ``
обрабатывают обратную косую черту и вложенность немного отличаются. Новый стиль $ ()
интерпретирует все между ()
как команду.
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 использует ``
для своей цели, боль была написана на этот ответ:)
Очевидная разница, которую я наблюдаю, заключается в том, что вы не можете вставлять backticks, пока вы можете вложить $ ()
. Возможно, оба они существуют по наследственным причинам. Точно так же команды .
и source
являются синонимами.
$ ()
не работает со старой оболочкой Bourne. Но прошло много лет с тех пор, как я работал со старой оболочкой Борна.
Другое примечание: $ ()
будет использовать больше системного ресурса, чем использование обратных ссылок, но немного быстрее.
В Освоение сценариев оболочки Unix , Рэндал К. Майкл провел тест в главе под названием «24 способа для обработки файла по строкам ».
Чтобы добавить к сказанному здесь, вы можете использовать обратные элементы для имитации встроенных комментариев:
echo foo `# Я - комментарий!` bar
Вывод: foo bar
.
Для получения дополнительной информации см. следующее: https://stackoverflow.com/a/12797512 (обратите внимание также на комментарии ниже пост.)
Синтаксис $ ()
не будет работать со старой оболочкой bourne.
С более новыми оболочками ``
и $ ()
эквивалентны, но $ ()
гораздо удобнее использовать, когда вам нужно вложить несколько команд.
Например:
echo $ (basename $ (dirname $ (dirname /var /adm /sw /save)))
легче печатать и отлаживать, чем:
echo `basename \` dirname \\\ `dirname /var /adm /sw /save \\\` \ ``