Malo ljuske preusmjeravanja

10. svibanj 2009 po Prashant · Komentari
Varalica pod: tehnologija

Evo kako smo obično ljuske preusmjerenje ne
$ ./pgm.sh args >out.txt 2>err.txt
Htio sam promijeniti ga malo i pokrenuti kako slijedi
$ ./pgm.sh args
uz uvjet da izlaz i greška trebao ići na neki filename unutar računa pgm.sh na temelju args. Jedan ilustrativan slučaj bi mogao biti kad je datum dio args. Dakle, želite stdout ići reći / vaše / direktorij / pgm_out_YYYYMMDD.txt 1

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

Ovo je mjesto gdje exec dolazi na naše spašavanja. Dodamo li 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 se preusmjeriti hi hii kao i da out.txt

Slično preusmjeriti 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 preusmjeravanja na neke datoteke iz unutrašnjosti ljuske, recimo Program obračunava datoteke u nekim varijabla OUTFILE, mogli bismo upravo učinio exec 1>$OUTFILE

To rješava trenutni problem. Ali, vi svibanj želite proći kroz sljedeći primjer koji postiže 'slučajnim pristupom' 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 stvoriti ovaj naziv datoteke na temelju neke logike u programu samog.
2 1 u 1> out.txt je suvišan, ali pojašnjava ovdje da smo preusmjeravanje FD 1