Hieman kuoren uudelleenohjaus

10 toukokuu 2009 by Prashant · Comments
Filed under: tekniikka

Tässä on, miten yleensä tee kuori uudelleenohjaus
$ ./pgm.sh args >out.txt 2>err.txt
Halusin muokata sitä hieman ja ajaa seuraava
$ ./pgm.sh args
vaatimusta, ettei tuotantoon ja virhe olisi mennä jonkin tiedoston laskettu sisälle pgm.sh perustuu args. Yksi valaiseva tapaus voisi olla, kun päivä on osa args. Joten haluaisit stdout mennä sanoa / oma / hakemisto / pgm_out_YYYYMMDD.txt 1

Ongelma tavallinen suunnata N>file.txt eli yhdistämällä tiedosto avainsana N tiedosto.txt, että se toimii vain uusien haarainen prosessia eikä nykyinen prosessi.
niin
$ echo hi 1>out.txt ; echo hii lähettää terveisiä out.txt mutta tulostaa hii vakiotulosteeseen. 2

Tässä on exec tulee meidän pelastus. Jos lisäämme exec 1>somefile.txt tulostetaan sitten muusta kirjoitus menee somefile.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh ohjaa hi sekä hii ja out.txt

Samoin voidaan ohjata stdout ja stderr teemme jotain tällaista
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

Nyt tulossa takaisin alkuperäiseen kohtaan suunnata jossain tiedoston sisällä kuoren, sanotaan ohjelmassa lasketaan tiedostonimen joissakin muuttujan OUTFILE, olisimme voineet vain tehdä exec 1>$OUTFILE

Se ratkaisee nykyisen ongelman. Mutta ehkä haluat käydä läpi seuraava esimerkki, jolla saavutetaan "random access" tiedoston kuorelliset script. Esimerkki on kotoisin täältä
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

Selityksiä, koodi ei ole itsestään selvä.
-
1 Se voi myös tehdä $ ./pgm.sh args >pgm_out`date +%Y%m%d` , mutta idea on luoda tiedoston nimen perusteella logiikkansa itse ohjelmaan.
2 1 1> out.txt on turha, mutta se selventää, että me suuntaavat fd 1