Malo ljuske preusmjeravanja

10. svibanj 2009 by prashant · Komentari
Varalica pod: tehnologija

Evo kako smo obično ljuske napraviti preusmjeravanje
$ ./pgm.sh args >out.txt 2>err.txt
Htjela sam ga malo modificirati i pokrenuti kako slijedi
$ ./pgm.sh args
uz uvjet da izlaz i greška trebao ići na neki filename unutar izračunanoga pgm.sh na temelju args. Jedan ilustrativan slučaj mogao biti datum kad je dio args. Tako da bih stdout ići reći / vaše / direktorij / pgm_out_YYYYMMDD.txt 1

Problem sa standardnim načinom preusmjeravanje N>file.txt tj. udruživanje N file deskriptora za file.txt, je da se radi samo za novo rašljastom procesa, a ne za tekući proces.
tako
$ echo hi 1>out.txt ; echo hii . poslat će pozdraviti out.txt, ali će se ispisati hii na stdout 2

Ovo je mjesto gdje exec dolazi na naše spašavanja. Dodamo exec 1>somefile.txt onda izlaz iz ostatka skriptu će ići na somefile.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh će preusmjeravati hi hii kao i da out.txt

Slično preusmjeravati stdout kao stderr ćemo učiniti nešto ovako
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

Sad se vraćaju na izvornu točke preusmjeriti na neke datoteke iz unutrašnjosti ljuske, recimo program za kompjutorska naziv datoteke u nekom promjenjivom OUTFILE, mogli bismo samo napravili exec 1>$OUTFILE

To rješava trenutni problem. Ali vi svibanj želite proći kroz sljedeći primjer koji postiže možeš random access "datoteke u shell skripta. Primjer je iz ovdje
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

S komentarima, ovaj kod je samo sebi.
-
1 Također se može učiniti $ ./pgm.sh args >pgm_out`date +%Y%m%d` no ideja je da se ovaj naziv datoteke generiraju na temelju neke logike u programu samog.
2 1 u 1> out.txt je suvišan, ali ovdje pojašnjava da smo preusmjeravanjem FD 1