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 • Команда