Linux. Команда exec
Запуск сценария из командной строки приводит к запуску новой оболочки, которая и будет выполнять список команд, содержащихся в файле сценария. Другими словами, любой сценарий (или программа) запускается как дочерний процесс родительской командной оболочки. Однако, программа, выполняемая по команде exec, заменяет текущую программу, и поэтому в системе остается на один выполняемый процесс меньше.
Действие, когда какая либо команда или сама командная оболочка инициирует (порождает) новый подпроцесс, чтобы выполнить какую либо работу, называется ветвлением (forking) процесса. Новый процесс называется «дочерним» (или «потомком»), а породивший его процесс — «родительским» (или «предком»). В результате и потомок и предок продолжают исполняться одновременно — параллельно друг другу.
Общая форма команды exec:
exec программа
Пусть нам нужно настроить среду для выполнения определенной задачи, например, для работы с базой данных: заменить приглашение в переменной PS1 на DataBase, добавить в переменную PATH каталог bin базы данных, изменить переменную CDPATH (чтобы было удобнее использовать команду cd) и т.п.
#!/bin/bash # # Установить и экспортировать переменные, связанные с базой данных # HOME=/usr/database BIN=$HOME/bin RPTS=$HOME/rpts DATA=$HOME/data PATH=$PATH:$BIN CDPATH=:$HOME:$RPTS PS1="DataBase: " export HOME BIN RPTS DATA CDPATH PS1 # запустить новую оболочку с замещением текущего сценария exec /bin/bash
С помощью команды exec можно переназначить стандартный ввод (stdin) и стандартный вывод (stdout). Например, переназначим стандартный ввод:
$ exec < inputFile.txt # или exec 0< inputFile.txt
Любые последующие команды, читающие данные со стандартного ввода, будут читать их из файла inputFile.txt. Пример использования в сценарии:
#!/bin/bash exec 0< data.txt count=1 while read line ; do echo "Line $count: $line" count=$(( $count + 1 )) done
Переадресация стандартного вывода выполняется аналогично:
$ exec > outputFile.txt # или exec 1> outputFile.txt
Следует, однако, иметь в виду, что в обоих примерах команда exec применялась не для запуска новой программы на выполнение, а лишь для переназначения стандартного ввода или вывода.
Чтобы переназначить стандартный ввод обратно на терминал, достаточно ввести команду:
$ exec < /dev/tty
Аналогичным образом переназначается и стандартный вывод:
$ exec > /dev/tty
Поиск: Bash • CLI • Linux • exec • export • stdin • stdout • Команда