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


18

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

Например:

chmod 777 $(pwd)

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 .

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


2

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

chmod 777 $(pwd)

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.