Un po 'di redirezione della shell
Ecco come si fa normalmente redirezione della shell
$ ./pgm.sh args >out.txt 2>err.txt
Volevo modificarlo un po 'ed eseguire la seguente
$ ./pgm.sh args
con il requisito che la produzione e l'errore dovrebbe andare in qualche file all'interno pgm.sh calcolato sulla base di argomenti. Un caso esemplare potrebbe essere data quando si è parte di argomenti. Così si desidera stdout andare a dire / your / directory / pgm_out_YYYYMMDD.txt 1
Il problema con il modo standard di reindirizzare N>file.txt cioè, che associa il descrittore di file N a file.txt, è che funziona solo per il processo di nuova forcella e non per il processo corrente.
così
$ echo hi 1>out.txt ; echo hii . invierà ciao a out.txt ma stamperà hii stdout 2
Questo è dove exec viene in nostro soccorso. Se aggiungiamo exec 1>somefile.txt poi uscita dal resto dello script andrà a somefile.txt
$. / Test.sh reindirizzerà hi così come hii a out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
Allo stesso modo per reindirizzare stdout e stderr faremo qualcosa di simile
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
Ora tornando al punto di partenza di riorientare a qualche file dall'interno del guscio, diciamo il nome del file del programma calcolata in qualche OUTFILE variabile, avremmo potuto appena fatto exec 1>$OUTFILE
Che risolve il problema attuale. Ma come si può passare attraverso il seguente esempio che raggiunge 'accesso casuale' di file in script di shell. Esempio è da qui
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
Con i commenti, questo codice si spiega da sé.
-
1 Può anche essere fatto da $ ./pgm.sh args >pgm_out`date +%Y%m%d` ma l'idea è quella di generare il nome del file in base a una logica in programma stesso.
2 1 1> out.txt è ridondante, ma chiarisce qui che si stanno riorientando fd 1



































