Linux. Команда exec

01.04.2018

Теги: BashCLIexportLinuxstdinstdoutКоманда

Запуск сценария из командной строки приводит к запуску новой оболочки, которая и будет выполнять список команд, содержащихся в файле сценария. Другими словами, любой сценарий (или программа) запускается как дочерний процесс родительской командной оболочки. Однако, программа, выполняемая по команде 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 • Команда

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.