Немного оболочки перенаправления
Вот как мы обычно оболочки перенаправления
$ ./pgm.sh args >out.txt 2>err.txt
Я хотел, чтобы изменить его, бит и работать как следует
$ ./pgm.sh args
с требованием, чтобы выход и ошибка должна пойти на некоторые файла вычисляется внутри pgm.sh на основе аргументов. Один показательный случай может быть, когда дата является частью аргументы. Итак, вы хотели бы стандартный вывод пойти сказать / файл / каталог / pgm_out_YYYYMMDD.txt 1
Проблема с стандартным путем перенаправления N>file.txt то есть, связав дескриптор файла N для file.txt, является то, что он работает только для вновь раздвоенной процесс, а не для текущего процесса.
так
$ echo hi 1>out.txt ; echo hii . пошлет привет к out.txt но выведет на стандартный вывод НИ 2
Это где exec приходит к нам на помощь. Если мы добавим exec 1>somefile.txt то выход из остальной части скрипта пойдет на somefile.txt
$. / Test.sh перенаправит привет, а также к НИ out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
Аналогичным образом перенаправить стандартный вывод, а также стандартный поток ошибок, мы сделаем что-то вроде этого
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
Теперь возвращаясь к исходной точке перенаправление на какой-либо файл с внутренней оболочкой, скажем, программы вычисляется имя файла в какой-либо переменной OUTFILE, мы могли бы просто сделать exec 1>$OUTFILE
Это решает текущие проблемы. Но вы можете, как пройти следующий пример, который достигает "случайного доступа" из файла в сценарий. Пример от сюда
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890
С комментариями, этот код говорит сама за себя.
-
1 Он также может быть сделано путем $ ./pgm.sh args >pgm_out`date +%Y%m%d` но идея для создания этого файла имя, основанное на некоторой логики в самой программе.
2 1 1> out.txt является избыточным, но это проясняет здесь, что мы перенаправления FD 1



































