На данный момент мне известны два основных способа:
Явно: заключение списка команд в скобки
Неявно: каждая команда в конвейере
Существуют ли другие способы, явные или неявные, создания подоболочек в bash?
решение1
От man bash
:
- Если команда завершается оператором управления
&
, оболочка выполняет команду в фоновом режиме в подоболочке. Оболочка не ждет завершения команды, а возвращаемый статус равен 0. - Coprocess — это команда оболочки, которой предшествует
coproc
зарезервированное слово.
Coprocess выполняется асинхронно в подоболочке, как если бы команда была завершена оператором управления & - Встроенная
complete
команда оболочки: при вызове с-C command
опциейcommand
выполняется в среде подоболочки, а ее вывод используется в качестве возможных завершений. - Подстановка команд, команды, сгруппированные с помощью скобок, и асинхронные команды вызываются в среде подоболочки, которая является дубликатом среды оболочки.
решение2
Это зависит от того, что вы подразумеваете под «подоболочкой». И вы можете упустить суть в вашем пункте «каждая команда в конвейере».
Каждый раз, когда вы бежителюбой(внешняя) программа (т. е. скрипт или исполняемый двоичный файл, в отличие от встроенной оболочки), если вы не используете , вы запускаете ее в подпроцессе (или процессах). Оболочка разветвляется и выполняет программу. не создает подоболочку больше, чем и делают по отдельности.exec program
ls | wc
ls
wc
Интересно то, что включение его в конвейер может привести квстроенная оболочкадля запуска в подоболочке. Рассмотрим этот пример:
$ читать v кот # Это вводимые пользователем данные. $ эхо "$v" кот $ echo cougar | читать v $ эхо "$v" кот
Вторая read v
команда выполняется в подоболочке, поскольку она является частью конвейера echo cougar | read v
. Поэтому значение cougar
теряется и $v
сохраняется первое значение.
Аналогично, команды типа
$ echo foo | cd /
$ cd / | cat
$ echo foo | exit
$ exit | cat
не влияют на основную оболочку.