Что такое подстановка команд в оболочке?

Если вы использовали Nautilus для подключения к smb-серверу, может оказаться полезной следующая команда:

mount -v | grep -i 'gvfs'
6
04.03.2019, 21:31
2 ответа

«Подстановка команд» — это название функции языка оболочки, которая позволяет выполнять команду и заменять вывод этой команды (заменой )текста команды.

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

Подстановка команды, т. е. полное $(...)выражение, заменяется его выходными данными, что является основным использованием подстановок команд.

Команда, которую выполняет подстановка команд, выполняется в подоболочке, что означает, что она имеет собственную среду, которая не повлияет на среду родительской оболочки.

Не все выполнения подоболочек являются подстановками команд, хотя (см. дополнительные примеры в конце ).

Пример, показывающий, что подстановка команд выполняется в подоболочке:

$ s=123
$ echo "hello $( s=world; echo "$s" )"
hello world
$ echo "$s"
123

Здесь переменная sустановлена ​​в строку 123. В следующей строке вызывается echoдля строки, содержащей результат подстановки команд.Подстановка команды устанавливает sв строку worldи выводит эту строку. Строка world— это вывод команды в подстановке команд , и, таким образом, если бы это было запущено под set -x, мы бы увидели, что вторая строка выше была бы расширена до echo 'hello world', который производит hello worldна терминале:

$ set -x
$ echo "hello $( s=world; echo "$s" )"
++ s=world
++ echo world
+ echo 'hello world'
hello world

(bashдобавляет дополнительный уровень +подсказок на каждый уровень подоболочки подстановки команд в выводе трассировки, другие оболочки могут этого не делать)

Наконец, мы показываем, что команда внутри подстановки команд выполнялась в своей собственной подоболочке, поскольку это не повлияло на значение sв вызывающей оболочке (значение sпо-прежнему 123, а не world).

Существуют и другие ситуации, когда команды выполняются в подоболочках, например,

echo 'hello' | read message

В bash, если вы не установите lastpipeпараметр (только в не -интерактивных экземплярах ), readвыполняется в подоболочке, что означает, что $messageне будет изменено в родительской оболочке, т.е. выполнение echo "$message"после приведенной выше команды будет отображать пустую строку (или любое другое значение $message, которое было до ).

Замена процесса в bashтакже выполняется в подоболочке:

cat < <( echo 'hello world' )

Это также отличается от подстановки команд.

20
27.01.2020, 20:22
a=$(command)

сохранит значение результата commandв переменной.

На самом деле больше ничего нет.

В качестве примечания, я полагаю,:

a=`command`

устарел и имеет то же значение, что и выше.

0
27.01.2020, 20:22

Теги

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