En smule 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 produktionen og fejl skal gå til nogle filename beregnet inde pgm.sh baseret på args. Et illustrativt tilfælde kunne være, når datoen er en del af args. Så du vil gerne stdout at gå til at sige / din / mappe / pgm_out_YYYYMMDD.txt 1
Problemet med almindelige måde at omdirigere N>file.txt dvs knytte file descriptor N til file.txt, er, at det virker kun for nyligt gaffelformet processen og ikke til 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 sådan noget
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 den oprindelige punkt 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 tanken er at generere denne fil navn baseret på nogle logik i selve programmet.
2 1 1> out.txt er overflødigt, men det præciseres her, at vi omdirigerer fd 1



































