«Подстановка команд» — это название функции языка оболочки, которая позволяет выполнять команду и заменять вывод этой команды (заменой )текста команды.
Никакая другая функция языка оболочки не позволяет вам сделать это.
Подстановка команды, т. е. полное $(...)
выражение, заменяется его выходными данными, что является основным использованием подстановок команд.
Команда, которую выполняет подстановка команд, выполняется в подоболочке, что означает, что она имеет собственную среду, которая не повлияет на среду родительской оболочки.
Не все выполнения подоболочек являются подстановками команд, хотя (см. дополнительные примеры в конце ).
Пример, показывающий, что подстановка команд выполняется в подоболочке:
$ 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' )
Это также отличается от подстановки команд.
Поскольку вы используете Debian, вместо этого вы можете использовать пакеты Rust:
sudo apt install cargo
Это значительно снизит требования по сравнению с 1,2 ГБ, взятыми .rustup
.
В Debian 10 это даст вам Rust 1.34, которого достаточно для сборки rust-synapse-compress-state
.