Трохи оболонки перенаправлення

Ось як ми зазвичай робимо оболонки перенаправлення
$ ./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 січня> out.txt є надлишковим, але уточнює, що тут ми перенаправлення FD 1