Un pic de coajă de redirecţionare

10 mai 2009 de Prashant · Comentarii
Filed under: tehnologie

Iată cum putem face īn mod normal, coajă de redirecţionare
$ ./pgm.sh args >out.txt 2>err.txt
Am vrut să-l modifica un pic şi executaţi, după cum urmează
$ ./pgm.sh args
cu cerinţa ca ieşire de eroare şi ar trebui să meargă la un nume de fişier īn interiorul pgm.sh calculate pe baza argumente. Un caz ilustrativ ar putea fi atunci cānd data este parte din argumente. Deci, v-ar plăcea să merg la stdout spun / dvs. / director / pgm_out_YYYYMMDD.txt 1

Problema cu modul standard de redirecţionarea N>file.txt de exemplu, asociind fişier descriptor de N a file.txt, este că funcţionează numai pentru procesul de nou bifurcată, şi nu pentru procesul curent.
astfel
$ echo hi 1>out.txt ; echo hii . va trimite la hi out.txt, dar va imprima hii la stdout 2

Acest lucru este īn cazul īn care exec vine vorba de salvarea noastră. Dacă am adăuga exec 1>somefile.txt apoi de ieşire de la restul de script-ul va merge la somefile.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh va redirecţiona hi hii, precum şi la out.txt

Īn mod similar de a redirecţiona stdout, precum şi stderr vom face ceva de genul asta
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

Acum, revenind la punctul original de la redirecţionarea unor fişier din interiorul coajă, să spunem că programul de calculat numele fişierului īn unele OUTFILE variabile, am fi putut face doar exec 1>$OUTFILE

Care rezolvă problema actuală. Dar ar putea să vrea să treacă prin următorul exemplu care să asigure "acces aleatoriu" de fişier īn script de shell. Exemplu este de aici
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

Cu comentarii, acest cod este de la sine explicativ.
-
1 poate fi, de asemenea, face prin $ ./pgm.sh args >pgm_out`date +%Y%m%d` dar ideea este de a genera acest nume de fişier bazat pe o anumită logică īn programul propriu-zis.
2 1 din 1> out.txt este redundantă, dar se precizează că aici suntem redirecţionarea fd 1