En smule af shell omdirigering
Her er, hvordan vi normalt gør shell omdirigering
$ ./pgm.sh args >out.txt 2>err.txt
Jeg ønskede at ændre det lidt og køre som følger
$ ./pgm.sh args
med kravet om, at output og fejl skal gå til nogle filename beregnet inde pgm.sh baseret på args. Et illustrerende tilfælde kunne være, når datoen er en del af args. Så du vil gerne stdout at gå at sige / dit / bibliotek / pgm_out_YYYYMMDD.txt 1
Problemet med almindelige måde at omdirigere N>file.txt dvs knytte filen deskriptor N til file.txt, er, at det fungerer kun for de nyligt kløvet processen og ikke for den aktuelle proces.
så
$ echo hi 1>out.txt ; echo hii . vil sende hej til out.txt men vil udskrive HII til stdout 2
Det er her exec kommer os til undsætning. Hvis vi tilføjer exec 1>somefile.txt derefter output fra resten af scriptet vil gå til somefile.txt
$. / Test.sh vil omdirigere hi samt HII til out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
Tilsvarende at omdirigere stdout samt stderr vi vil gøre noget som dette
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
Nu kommer tilbage til oprindelige punkt for at omdirigere nogle fil fra inde i skallen, lad os sige program beregnet filnavnet i nogle variable outfile, kunne vi lige har gjort exec 1>$OUTFILE
Det løser det aktuelle problem. Men du kan lide at gå gennem følgende eksempel, hvor der opnås "random access" af filen i shell script. Eksempel er fra her
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
Med kommentarer, er denne kode selvforklarende.
-
1 Det kan også ske ved $ ./pgm.sh args >pgm_out`date +%Y%m%d` men ideen er at generere denne fil navn baseret på nogle logik i selve programmet.
2 1 ud af 1> out.txt er overflødigt, men det præciseres her, at vi omdirigerer fd 1



































