En bit av skallet omadressering

10 mai 2009 ved Prashant
Arkivert under: teknologi

Her er hvordan vi vanligvis gjør shell omadressering
$ ./pgm.sh args >out.txt 2>err.txt
Jeg ønsket å endre den litt og kjøre som følger
$ ./pgm.sh args
med kravet om at produksjonen og feilen bør gå til noen filnavn beregnet inne pgm.sh basert på args. En illustrerende tilfelle kan være når datoen er en del av args. Så du ønsker stdout å gå å si / din / katalog / pgm_out_YYYYMMDD.txt 1

Problemet med standard måte å omdirigere N>file.txt dvs. knytte fil beskrivelse N å fil.txt, er at det fungerer bare for den nylig gaffelformet prosessen og ikke for den nåværende prosessen.

$ echo hi 1>out.txt ; echo hii . sender hei til out.txt men vil ut HII til stdout 2

Dette er hvor exec kommer til unnsetning vår. Hvis vi legger exec 1>somefile.txt da produksjonen fra resten av skriptet 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 for å omdirigere stdout samt stderr vi gjøre noe 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

Nå kommer tilbake til opprinnelig punkt viderekobler til noen fil fra innsiden av skallet, la oss si program beregnet filnavnet i noen variable utfil, kunne vi nettopp har gjort exec 1>$OUTFILE

Som løser den aktuelle problemet. Men du kan gjerne gå gjennom følgende eksempel som oppnår "random access" av fil 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 koden selvforklarende.
-
1 Det kan også gjøres ved $ ./pgm.sh args >pgm_out`date +%Y%m%d` men tanken er å generere denne filnavn basert på noen logikk i selve programmet.
2 1 i 1> out.txt er overflødig, men det klargjør her at vi omdirigere FD 1

Kommentarer

    bloggkommentarer drevet av Disqus