Ang isang piraso ng shell pag-redirect

Mayo 10, 2009 sa pamamagitan ng prashant · Mga komento
File sa ilalim: teknolohiya

Narito ang kung paano namin normal na gawin shell pag-redirect
$ ./pgm.sh args >out.txt 2>err.txt
Nais kong baguhin ito ng kaunti at tumakbo tulad ng mga sumusunod
$ ./pgm.sh args
sa mga kinakailangan na output at error ay dapat pumunta sa ilang mga filename nakalkula sa loob pgm.sh base sa args. Isa nakapagpapaliwanag kaso ay maaaring kapag petsa ay bahagi ng args. Kaya nais mong stdout pumunta sa sinasabi / ng iyong / directory / pgm_out_YYYYMMDD.txt 1

Ang problema sa karaniwang paraan ng pag-redirect ng N>file.txt yan, associating file descriptor N sa file.txt, ay na ito ay gumagana lamang para sa mga bagong bika proseso at hindi para sa kasalukuyang proseso.
kaya
$ echo hi 1>out.txt ; echo hii ay magpapadala hi sa out.txt ngunit-print ang hii sa stdout 2

Ito ay kung saan exec pagdating sa aming iligtas. Kung namin magdagdag ng exec 1>somefile.txt pagkatapos ay ang output mula sa mga natitirang ang script ay pumunta sa somefile.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh ay redirect hi pati na rin bilang hii sa out.txt

Katulad sa redirect stdout pati na rin stderr kami gawin ang isang bagay tulad nito
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

Ngayon darating na bumalik sa orihinal na punto ng pag-redirect sa ilang mga file mula sa loob ng shell, sabihin nating programa nakalkula ang filename sa ilang mga variable OUTFILE, maaari lamang namin gawin exec 1>$OUTFILE

Na solves ang kasalukuyang problema. Ngunit maaari mo bang pumunta sa pamamagitan ng sumusunod na halimbawa na achieves 'random access' ng file sa shell script. Halimbawa ay mula dito
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

Na may mga komento, ang code na ito ay nagpapaliwanag sa sarili.
-
1 maaari din ito gawin sa pamamagitan ng $ ./pgm.sh args >pgm_out`date +%Y%m%d` ngunit ideya ay upang bumuo ng pangalan ng file na ito batay sa ilang mga lohika sa programa mismo.
2 1 sa 1> out.txt ay maulit ngunit ito clarifies dito na kami ay nagre-redirect ng fd 1