Pagina 1 di 2
[BASH] redirect sterr in file e a video
Inviato: dom 1 mag 2011, 12:40
da conraid
Come posso fare per far si che lo stderr venga mostrato a video e rediretto in un file insieme allo stdout (il quale però non deve essere mostrato a video). E' possibile?
In pratica un insieme di questi 2 comandi
Re: [BASH] redirect sterr in file e a video
Inviato: dom 1 mag 2011, 13:19
da targzeta
Premesso che io ci ho sempre capito poco del redirect e della duplicazione dei puntatori a file della bash. Sembra che questo comando funzioni:
speriamo che qualcuno ci chiarisca meglio le idee
Emanuele
Re: [BASH] redirect sterr in file e a video
Inviato: dom 1 mag 2011, 13:24
da conraid
nel file non compare l'errore
Re: [BASH] redirect sterr in file e a video
Inviato: dom 1 mag 2011, 13:28
da targzeta
Strano, a me funziona:
Codice: Seleziona tutto
$> ls . /root/ 2>&1 1>/tmp/casa | tee -a /tmp/casa
ls: impossibile aprire la directory /root/: Permesso negato
$> cat /tmp/casa
.:
totale 33K
[cut]...
ls: impossibile aprire la directory /root/: Permesso negato
ed ho provato anche più di una volta.
Emanuele
Re: [BASH] redirect sterr in file e a video
Inviato: dom 1 mag 2011, 13:30
da targzeta
Magari prova a mettere un '1>>file'. Forse se viene eseguito prima tee, poi il suo output viene eliminato dall'output di '1>'. Potrebbe essere una questione di chi scrive prima nel file tra i due comandi.
Emanuele
Re: [BASH] redirect sterr in file e a video
Inviato: dom 1 mag 2011, 13:39
da conraid
spina ha scritto:Magari prova a mettere un '1>>file'. Forse se viene eseguito prima tee, poi il suo output viene eliminato dall'output di '1>'. Potrebbe essere una questione di chi scrive prima nel file tra i due comandi.
Emanuele
così funziona
Re: [BASH] redirect sterr in file e a video
Inviato: dom 1 mag 2011, 14:58
da Mario Vanoni
spina ha scritto:Premesso che io ci ho sempre capito poco del redirect e della duplicazione dei puntatori a file della bash. Sembra che questo comando funzioni:
speriamo che qualcuno ci chiarisca meglio le idee :D
Emanuele
E` sbagliato l'ordine, commando > file 2&1
man 1 bash
Codice: Seleziona tutto
Note that the order of redirections is significant. For example, the command
ls > dirlist 2>&1
directs both standard output and standard error to the file dirlist, while the command
ls 2>&1 > dirlist
directs only the standard output to file dirlist, because the standard error was duplicated as standard output before the standard output was redirected to dirlist.
Re: [BASH] redirect sterr in file e a video
Inviato: dom 1 mag 2011, 15:05
da targzeta
Sembra in linea con le richieste di conraid. Abbiamo mandato solo l'stdout nel file, poi l'stderr lo abbiamo duplicato e inviato a tee, il quale lo mostra a video e lo appende al file. Non capisco perché dici che è sbagliato l'ordine.
Emanuele
Re: [BASH] redirect sterr in file e a video
Inviato: dom 1 mag 2011, 15:37
da Mario Vanoni
spina ha scritto: Non capisco perché dici che è sbagliato l'ordine.
In un comando che deve raccogliere allo stesso tempo stdout e stderr,
a fine riga, e solo a fine riga, viene aggiunto 2>&1
se si pipa, no problems, dopo 2>&1 | tee [-a] altrofile
Re: [BASH] redirect sterr in file e a video
Inviato: dom 1 mag 2011, 15:51
da targzeta
Mario, io non ti seguo. Il comando funziona, quindi o ci spieghi un modo alternativo per fare la stessa o, magari, ci spieghi bene come funziona la duplicazione dei file descriptor. Il pezzo di man che hai postato casca a pennello, io quel pezzo non l'ho mai capito.
Emanuele
Re: [BASH] redirect sterr in file e a video
Inviato: dom 1 mag 2011, 16:35
da Mario Vanoni
spina ha scritto:Il pezzo di man che hai postato casca a pennello, io quel pezzo non l'ho mai capito.
Note that the order of redirections is significant. For example, the command
Notate che l'ordine dell'indirizzo e` importante. P. e.
ls > dirlist 2>&1
directs both standard output and standard error to the file dirlist, while the command
dirige sia stdout che stderr al file dirlist, mentre
ls 2>&1 > dirlist
directs only the standard output to file dirlist, because the standard error was duplicated as standard output before the standard output was redirected to dirlist.
dirige solo stdout al file dirlist, perche` stderr e` stato duplicato quale stdout prima che stdout fosse avviato a dirlist.
Esempio riproducibile:
ls filenonesistente > questotest
errore sullo schermo, il file non esiste
ed il file questotest e` vuoto
ls filenonesistente > questotest 2>&1
nessun errore visibile, lo leggi in questotest
ls filenonesistente 2>&1 > questotest
errore sullo schermo, il file non esiste
ed il file questotest e` vuoto
Re: [BASH] redirect sterr in file e a video
Inviato: lun 2 mag 2011, 11:49
da conraid
mario, come dici tu però non mostra a video niente, e scrive 2 volte nel file
Re: [BASH] redirect sterr in file e a video
Inviato: lun 2 mag 2011, 15:27
da Mario Vanoni
conraid ha scritto:mario, come dici tu però non mostra a video niente, e scrive 2 volte nel file
Corrado, non capisco, quale variante scrive 2 volte nel file?
Re: [BASH] redirect sterr in file e a video
Inviato: lun 2 mag 2011, 15:48
da conraid
dovevo aver sbagliato io, in pratica avevo lo stdout due volte, e lo stderr una volta. Comunque a video non mostra niente.
Ti mostro un esempio:
Codice: Seleziona tutto
# /root/requiredbuilder -v -p -n -c aMule-2.2.6-i486-2_SBo.tgz 2>&1 1>> prova.tmp | tee -a prova.tmp
ldd /tmp/tmp.9HNmnG/usr/bin/amule: libbfd-2.20.51.0.11.20100810.so => not found
# cat prova.tmp
ldd /tmp/tmp.9HNmnG/usr/bin/amule: libbfd-2.20.51.0.11.20100810.so => not found
atk >= 1.32.0-i486-1
cairo >= 1.10.2-i486-2
cxxlibs >= 6.0.14-i486-1 | gcc-g++ >= 4.5.2-i486-2
expat >= 2.0.1-i486-2
fontconfig >= 2.8.0-i486-1
freetype >= 2.4.4-i486-1
gcc >= 4.5.2-i486-2
gdk-pixbuf2 >= 2.23.3-i486-1
glib2 >= 2.28.6-i486-1
glibc-solibs >= 2.13-i486-4
gtk+2 >= 2.24.4-i486-1
libICE >= 1.0.7-i486-1
libSM >= 1.2.0-i486-1
libX11 >= 1.4.3-i486-2
libXau >= 1.0.6-i486-1
libXcomposite >= 0.4.3-i486-1
libXcursor >= 1.1.11-i486-1
libXdamage >= 1.1.3-i486-1
libXdmcp >= 1.1.0-i486-1
libXext >= 1.2.0-i486-1
libXfixes >= 5.0-i486-1
libXi >= 1.4.2-i486-1
libXinerama >= 1.1.1-i486-1
libXrandr >= 1.3.1-i486-1
libXrender >= 0.9.6-i486-1
libXxf86vm >= 1.1.1-i486-1
libjpeg >= v8a-i486-1
libpng >= 1.4.5-i486-1
libtiff >= 3.9.4-i486-2
libxcb >= 1.7-i486-1
pango >= 1.28.4-i486-1
perl >= 5.12.3-i486-1
pixman >= 0.20.2-i486-1
util-linux >= 2.19-i486-1
wxgtk >= 2.8.12-i686-1cf
zlib >= 1.2.5-i486-4
# rm prova.tmp
# /root/requiredbuilder -v -p -n -c aMule-2.2.6-i486-2_SBo.tgz 1>> prova.tmp 2>&1 | tee -a prova.tmp
# cat prova.tmp
ldd /tmp/tmp.sxowP9/usr/bin/amule: libbfd-2.20.51.0.11.20100810.so => not found
atk >= 1.32.0-i486-1
cairo >= 1.10.2-i486-2
cxxlibs >= 6.0.14-i486-1 | gcc-g++ >= 4.5.2-i486-2
expat >= 2.0.1-i486-2
fontconfig >= 2.8.0-i486-1
freetype >= 2.4.4-i486-1
gcc >= 4.5.2-i486-2
gdk-pixbuf2 >= 2.23.3-i486-1
glib2 >= 2.28.6-i486-1
glibc-solibs >= 2.13-i486-4
gtk+2 >= 2.24.4-i486-1
libICE >= 1.0.7-i486-1
libSM >= 1.2.0-i486-1
libX11 >= 1.4.3-i486-2
libXau >= 1.0.6-i486-1
libXcomposite >= 0.4.3-i486-1
libXcursor >= 1.1.11-i486-1
libXdamage >= 1.1.3-i486-1
libXdmcp >= 1.1.0-i486-1
libXext >= 1.2.0-i486-1
libXfixes >= 5.0-i486-1
libXi >= 1.4.2-i486-1
libXinerama >= 1.1.1-i486-1
libXrandr >= 1.3.1-i486-1
libXrender >= 0.9.6-i486-1
libXxf86vm >= 1.1.1-i486-1
libjpeg >= v8a-i486-1
libpng >= 1.4.5-i486-1
libtiff >= 3.9.4-i486-2
libxcb >= 1.7-i486-1
pango >= 1.28.4-i486-1
perl >= 5.12.3-i486-1
pixman >= 0.20.2-i486-1
util-linux >= 2.19-i486-1
wxgtk >= 2.8.12-i686-1cf
zlib >= 1.2.5-i486-4
io voglio la prima situazione. A video solo lo stderr, in un file stderr e stdout
Re: [BASH] redirect sterr in file e a video
Inviato: lun 2 mag 2011, 16:06
da masalapianta
Mario Vanoni ha scritto:spina ha scritto:Premesso che io ci ho sempre capito poco del redirect e della duplicazione dei puntatori a file della bash. Sembra che questo comando funzioni:
speriamo che qualcuno ci chiarisca meglio le idee
Emanuele
E` sbagliato l'ordine, commando > file 2&1
no, l'ordine è giusto: se apri il file con quel fd prima di duplicarlo, anche il fd duplicato sarà associato a quel file, con il risultato che sia stdout che stderr finiranno nel file, mentre il risultato voluto è infilare stdout nel file e mandare stderr sul terminale (e successivamente in pipe a tee)