Trochu pláště přesměrování

Zde je, jak jsme normálně dělat shell přesměrování
$ ./pgm.sh args >out.txt 2>err.txt
Chtěl jsem to trochu změnit a spustit takto
$ ./pgm.sh args
s požadavkem, aby výkon a chyba by měla jít do nějakého souboru, počítané v pgm.sh založené na přepínači. Jeden ilustrativní případ, kdy by mohlo být datum je součástí ARGUMENTY. Takže byste chtěli jít na stdout říct / your / adresář / pgm_out_YYYYMMDD.txt 1

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

To je místo, kde exec přichází na záchranu. Přidáme-li exec 1>somefile.txt pak výstup ze zbytku skriptu půjde na somefile.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh přesměruje hi stejně jako hii se 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 vnitřní strany nádrže, řekněme Program počítá název souboru v nějaké proměnné outfile, mohli jsme právě udělal exec 1>$OUTFILE

, Který řeší aktuální problém. Ale můžete chtít projít následujícím příkladu, který dosahuje "Random přístupu" souboru ve skriptu shellu. 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 připomínkami, 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 nápad je vytvářet tento soubor název založený na nějakou logiku v samotném programu.
2 1 v 1> out.txt je nadbytečná, ale vyjasňuje, že se zde přesměrování fd 1