Trochu shell přesměrování

Zde je, jak se normálně shell přesměrování
$ ./pgm.sh args >out.txt 2>err.txt
Chtěl jsem to trochu upravit a spustit takto
$ ./pgm.sh args
s požadavkem, aby výkon a chyba by měla jít na nějakou souboru počítá v pgm.sh na args. Jeden ilustrativní případ, kdy by mohlo být datum je součástí args. Takže byste chtěli jít na stdout say / soubor / adresář / pgm_out_YYYYMMDD.txt 1

Problém se standardním způsobem přesměrovat N>file.txt tj. sdružující deskriptor souboru N soubor.txt, je, že funguje pouze pro nově vidlicový proces, a ne pro aktuální proces.
tak
$ echo hi 1>out.txt ; echo hii . pošle Ahoj out.txt, ale budou tisknout hii na stdout 2

To je místo, kde exec přijde na pomoc. Přidáme-li exec 1>somefile.txt pak výstup od zbytku skriptu půjde do somefile.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh přesměruje Dobrý den, stejně jako na hii out.txt

Podobně jako přesměrování stdout i stderr Uděláme něco takového
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

Nyní se vrací na původní místo přesměrování na nějaký soubor z uvnitř nádrže, řekněme programu počítá souboru v některé proměnné OUTFILE, mohli jsme udělat jen exec 1>$OUTFILE

, Který řeší aktuální problém. Ale můžete chtít projít následujícím příkladu, který dosahuje "náhodného přístupu" souboru v shell skript. Příklad je z zde
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

S komentáři, tento kód je samozřejmý.
-
1 To může také být děláno $ ./pgm.sh args >pgm_out`date +%Y%m%d` , ale idea je vytvořit tento název souboru na nějakou logiku v samotném programu.
2 1 1> out.txt je zbytečné, ale vysvětluje, že tady jsme přesměrování FD 1