Немного оболочки перенаправления

10 мая 2009 по Prashant
Рубрики: технологии

Вот как мы обычно делаем оболочки перенаправления
$ ./pgm.sh args >out.txt 2>err.txt
Я хотел, чтобы изменить его немного, и работать как следует
$ ./pgm.sh args
с требованием вывода и ошибок должны пойти на некоторые файла вычисляется в pgm.sh на основе аргументов. Один показательный случай может быть, когда дата является частью аргументов. Итак, вы хотели бы стандартный вывод пойти сказать / файл / каталог / pgm_out_YYYYMMDD.txt 1

Проблема с стандартным способом перенаправления N>file.txt т.е. связать дескриптор файла file.txt в N, то, что он работает только для вновь раздвоенной процесс, а не для текущего процесса.
так
$ echo hi 1>out.txt ; echo hii . пошлет привет к out.txt но выведет на стандартный вывод НИ 2

Здесь exec приходит к нам на помощь. Если мы добавим exec 1>somefile.txt то выход из остальной части скрипта пойдет somefile.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh будет перенаправлять привет, а также к НИ out.txt

Точно так же, чтобы перенаправить стандартный вывод, а также стандартный поток ошибок мы будем делать что-то вроде этого
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

Комментарии

    комментарии блога двигались на большой скорости Diskus