Когда собирался писать об этом операторе, на ум пришла считалочка, которой меня научили в пионерском лагере.

А поскольку я сейчас не матерюсь, чтоб никто не догадался, перейду на старославянский алфавит.

Итак: Шёл Хер по херу, встретил Хера на херу, взял Хер Хера за хер и к херам закинул нахер.

Вот, а сейчас говорят, что пионеров ничему хорошему не учили… exec.

Есть два варианта использования:

  1. exec command — билет в один конец. Для чего это нужно, я так и не понял, может, умные в комментах напишут. Перед выполнением команды bash фактически завершается, управление передаётся команде. И всё…

Пример:

exec echo 123 — результат очень красочный. Такой же, как и с любой другой командой.

  1. Перенаправление. Это штука крайне нужная и очень понятная. В других, нормальных ЯП она называлась бы open.

В Basic open "filename.txt" for input as #3
В bash exec 3<filename.txt
В Basic open "filename.txt" for output as #4
В bash exec 4>filename.txt
В Basic open "filename.txt" for append as #5
В bash exec 5>>filename.txt
В Basic open "filename.txt" for random as #6
В bash exec 6<>filename.txt

Приведу несколько полезных примеров

exec 2>/dev/null — все сообщения об ошибках отправить по пути, указанному в считалочке.

На код ошибки (типа errorlevel) это не влияет.

exec 1>filename.txt — все сообщения, кроме ошибок, отправить в файл.
exec 1>filename.txt 2>&1 — все сообщения, включая ошибки, отправить в файл.

Стоп-стоп. Откуда взялся &? Легко запомнить. Это костыль. Если вы не укажете &, сообщения попадут в файл с именем “1”.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Все помнят, что 0=/dev/stdin 1=/dev/stdout 2=/dev/stderr. Остальные 3–9 можем использовать по собственному усмотрению.

Пример:

#!/bin/bash
seq 1 3|tee 1.txt > 2.txt
exec 3<1.txt
while read -u3 L1;do
  exec 4<2.txt
  while read -u4 L2;do
    echo $L1 $L2
  done
done

seq — создаём два файла, по три строки в каждом.
exec 3<1.txt — открываем файл для чтения с дескриптором 3.
read -u3 L1 — читаем из файла с дескриптором 3. Дальше всё аналогично.

Если нужно закрыть 4, например, дескриптор за ненадобностью — exec 4>&-.