Когда собирался писать об этом операторе, на ум пришла считалочка, которой меня научили в пионерском лагере.
А поскольку я сейчас не матерюсь, чтоб никто не догадался, перейду на старославянский алфавит.
Итак: Шёл Хер по херу, встретил Хера на херу, взял Хер Хера за хер и к херам закинул нахер.
Вот, а сейчас говорят, что пионеров ничему хорошему не учили… exec.
Есть два варианта использования:
exec command— билет в один конец. Для чего это нужно, я так и не понял, может, умные в комментах напишут. Перед выполнением команды bash фактически завершается, управление передаётся команде. И всё…
Пример:
exec echo 123 — результат очень красочный. Такой же, как и с любой другой командой.
- Перенаправление. Это штука крайне нужная и очень понятная. В других, нормальных ЯП она называлась бы 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”.
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>&-.








Комментарии