Что такое $ () в команде?

18

Что находится $()в Linux Shell Commands?

Например:

chmod 777 $(pwd)
Sudoer
источник
1
Обратите внимание, что нет такой вещи, как команда line shell . Для Linux доступно несколько приложений оболочки.
Стефан Шазелас

Ответы:

21

Это очень похоже на backticks ``.

Это называется подстановка команд ( спецификация posix ) и вызывает подоболочку. Команда в скобках $()или между обратными галочками (``) выполняется в подоболочке, а выходные данные помещаются в исходную команду.

В отличие от обратных галочек, $(...)форма может быть вложенной. Таким образом, вы можете использовать подстановку команд внутри другой подстановки.

Существуют также различия в экранировании символов в подстановке. Я предпочитаю $(...)форму.

хаос
источник
4
backticks также могут быть вложенными. Обратите внимание, что завершающие символы новой строки удаляются из выходных данных команды.
Стефан Шазелас
2
@ StéphaneChazelas, как могут быть вложенные метки? Ты имеешь в виду под эксцентричным побегом?
хаос
3
Да: как сecho `echo \`echo foo\`` bar
Стефан Шазелас
1
Любое официальное упоминание о том, что backticks устарели?
vinc17
1
Нашел этот ответ: unix.stackexchange.com/questions/126927/… кажется, они не устарели. Изменился мой ответ, спасибо
хаос
5

В POSIX или POSIX-подобных оболочек ( ksh, bash, ash, zsh, yash...), это как ``: команда внутри $()выполняется , и заменить его на стандартный вывод. Разделение слов и генерация файлов выполняются, если они не заключены $()в двойные кавычки. таким образом

chmod 777 $(pwd)

следует заменить на:

chmod 777 "$(pwd)"

чтобы избежать расщепления слов и генерации имени файла в текущем рабочем каталоге.

Или даже лучше (за исключением некоторых оболочек, таких как zsh, если каталог был переименован):

chmod 777 "$PWD"

Так $PWDкак это специальная переменная, которая содержит путь к текущему рабочему каталогу в оболочках POSIX.

Или даже лучше:

chmod 777 .

Поскольку .запись в текущем каталоге является жесткой ссылкой на сам каталог.

vinc17
источник
2

Это $()используется для выполнения команды в основном внутри какой-либо другой команды.

chmod 777 $(pwd)

pwdКоманда дает текущий рабочий каталог. Таким образом, когда все будет выполнено, вывод pwd заменит свою позицию и послужит аргументом для chmod, и в результате весь ваш нынешний рабочий каталог получит разрешение, 777которое, я думаю, никогда не должно использоваться в производственной среде;).

beginer
источник