Trochu plášťa presmerovania

Tu je, ako sme normálne robiť shell presmerovania
$ ./pgm.sh args >out.txt 2>err.txt
Chcel som to trochu zmeniť a spustiť takto
$ ./pgm.sh args
s požiadavkou, aby výkon a chyba by mala ísť do nejakého súboru, počítané v pgm.sh založenej na prepínači. Jeden ilustratívny prípad, kedy by mohlo byť dátum je súčasťou ARGUMENTY. Takže by ste chceli ísť na stdout povedať / your / adresár / pgm_out_YYYYMMDD.txt 1

Problém so štandardným spôsobom presmerovať N>file.txt tj združujúca deskriptora súboru file.txt na N, je, že funguje len pre novo vidlicový procesu, a nie pre aktuálny proces.
tak
$ echo hi 1>out.txt ; echo hii . pošle ahoj out.txt ale bude tlačiť hii na stdout 2

To je miesto, kde exec prichádza na záchranu. Ak pridáme exec 1>somefile.txt potom výstup zo zvyšku skriptu pôjde na somefile.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh presmeruje hi rovnako ako hii sa out.txt

Podobne ako presmerovanie stdout aj stderr urobíme niečo také
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

Teraz sa vracia na pôvodné miesto presmerovanie na nejaký súbor z vnútornej strany nádrže, povedzme Program počíta názov súboru v nejakej premennej outfile, mohli sme práve urobil exec 1>$OUTFILE

, Ktorý rieši aktuálny problém. Ale môžete chcieť prejsť nasledujúcom príklade, ktorý dosahuje "Random prístupu" súboru vo skriptu shellu. Príklad je z tu
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 pripomienkami, tento kód je samozrejmý.
-
1 To môže tiež byť robené $ ./pgm.sh args >pgm_out`date +%Y%m%d` , ale nápad je vytvárať tento súbor názov založený na nejakú logiku v samotnom programe.
2 1 v 1> out.txt je nadbytočná, ale objasňuje, že sa tu presmerovanie fd 1