Каковы все способы создания подоболочки в bash?

Каковы все способы создания подоболочки в bash?

На данный момент мне известны два основных способа:

  • Явно: заключение списка команд в скобки

  • Неявно: каждая команда в конвейере

Существуют ли другие способы, явные или неявные, создания подоболочек в bash?

решение1

От man bash:

  • Если команда завершается оператором управления &, оболочка выполняет команду в фоновом режиме в подоболочке. Оболочка не ждет завершения команды, а возвращаемый статус равен 0.
  • Coprocess — это команда оболочки, которой предшествует coprocзарезервированное слово.
    Coprocess выполняется асинхронно в подоболочке, как если бы команда была завершена оператором управления &
  • Встроенная completeкоманда оболочки: при вызове с -C command опцией commandвыполняется в среде подоболочки, а ее вывод используется в качестве возможных завершений.
  • Подстановка команд, команды, сгруппированные с помощью скобок, и асинхронные команды вызываются в среде подоболочки, которая является дубликатом среды оболочки.

решение2

Это зависит от того, что вы подразумеваете под «подоболочкой». И вы можете упустить суть в вашем пункте «каждая команда в конвейере». 

Каждый раз, когда вы бежителюбой(внешняя) программа (т. е. скрипт или исполняемый двоичный файл, в отличие от встроенной оболочки), если вы не используете , вы запускаете ее в подпроцессе (или процессах). Оболочка разветвляется и выполняет программу.  не создает подоболочку больше, чем и делают по отдельности.exec programls | wclswc

Интересно то, что включение его в конвейер может привести квстроенная оболочкадля запуска в подоболочке. Рассмотрим этот пример:

$ читать v
кот                                     # Это вводимые пользователем данные.

$ эхо "$v"
кот

$ echo cougar | читать v

$ эхо "$v"
кот

Вторая read vкоманда выполняется в подоболочке, поскольку она является частью конвейера echo cougar | read v. Поэтому значение cougarтеряется и $vсохраняется первое значение.

Аналогично, команды типа

$ echo foo | cd /

$ cd / | cat

$ echo foo | exit

$ exit | cat

не влияют на основную оболочку.

Связанный контент