En smule shell omdirigering

10 maj 2009 ved Prashant
Filed under: teknologi

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.

$ 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

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh vil omdirigere hi samt hii til out.txt

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

Kommentarer

    blog kommentarer powered by Disqus