Output-redirection

Ciao,

ho un problemino, e allora a chi mi rivolgo ???, naturalmente a VOOOOOIIIIII!!! ;=)

No, scherzi a parte, sentite:

Mi sono comperato un libro da voi consigliato sulla bash (ed altri shells) e sono giunto al capitolo dove spiega la redirezione dell'output di un programma in un file con '>' oppure con '>>'. Ecco, quando lo faccio con i comandi come 'ls' o 'echo' tutto funziona, mentre quando lancio un programma ('wvdial', per intenderci), quello che vedo nel terminale, cioe` ATZ, ATDT numero, ecc., NON viene iscritto nel file. Solo quando interrompo il programma con CONTROL+C scrive l'ultima riga nel file. Io pero´ vorrei vedere TUTTO l'output di wvdial. In fondo e` anche mio diritto, no?? ;=)
Dal libro non ho capito il motivo, pero` io ho VOI...

ho lanciato: wvdial > test.log

TIA

sepp

prova

wvdial > test.log 1>&2

cu pazzo

joastner(a)dnet.it wrote:

eccomi! :slight_smile:

allora guarda... non è difficile come sembra:
ci sono due tipi di output che un programma dà: lo stdout (standard output)
e lo stderr (standard error).

prova per esempio ad eseguire il comando "cat /dev/urandom". visualizza
sullo schermo una marea di caratteri random (casuali) finchè non premi
ctrl+c. se ora provi a eseguire "cat /dev/urandom > caratteri_casuali", e
premendo ctrl+c dopo un pò, ti ritroverai un file chiamato
"caratteri_casuali" nella directory nella quali ti ritrovi pieno di
caratteri casuali. cioè lo standard output del comando "cat /dev/urandom".
ovviamente puoi reindirizzare lo stdout a qualsiasi cosa, anche un device:
se per esempio fai "cat /dev/urandom > /dev/hda" di ritrovi il disco fisso
riempito di caratteri casuali. fiko no?

bene... ora andiamo oltre: lo stderr. un programa, come ho scritto prima non
ha solo l'output normale, ma anche un output di errore. prova ad esempio il
comando "ps -u". ovviamente per il parametro "-u" del "ps" dovresti
specificare un user, e quindi il comando "ps" di darà un errore. questo
errore lo puoi redirezionare in questo modo: "ps -u 2> errore". così ti
ritroverai un file chiamato "errore" contente lo stderr del comando "ps".

puoi anche fare le due cose contemporaneamente: "ps -u root >output
2>errore". quel "2" prima del ">" indica proprio che vuoi che sia lo stderr
a essere redirezzionato. ecco perchè non vedi l'output di wvdial nel file:
perchè usa lo stderr per quell'output. se quindi fai "wvdial >wvdialog.txt
2>wvdilog.txt &" vedrai che tutto il suo output verrà scritto nel file.

ok. se hai capito questo continua a leggere, sennò cestina la mail e fai
finta di aver capito.

usando il carattere ">" dopo un comando quindi, redirezioni l'output di quel
comando a un file o a un device. se provi a fare "cat /etc/passwd >
/dev/dsp" invii il file "/etc/passwd" alla scheda sonora, e sentirai una
serie di suoni inutili. (i file .au vengono riprodotti proprio usando questo
metodo. se hai un file -au sul disco fisso puoi provare a fare "cat file.au

/dev/dsp").

ma torniamo ai file. se usi il carattere ">", il file al quale invii
l'output verrà sovrascritto con l'output appunto. ma mettiamo che non vuoi
sovrascrivere il file, ma vuoi che l'output venga aggiunto alla fine del
file, com'è utile per tenere dei log per esempio. mettiamo che vuoi eseguire
"wvdial" all'avvio del pc, e vuoi che il suo stdout venga loggato in un file
"wvdialog.txt" e il suo stderr venga loggato in un file chiamato
"wvdialerr.txt". però questa volta vuoi che l'output del comando venga
aggiunto alla fine del file, in modo che puoi andare a vedere cos'è successo
anche la penultima volta che hai eseguito il comando, e la volta prima e
così via. il comando da mettere nei tuoi scrips di avvio sarà "wvdial

wvdialog.txt 2>>wvdialerr.txt &". avrai già capito che usando ">>" al

posto di ">", *aggiungi* l'output al file invece di *sovrascrivere* il file
con l'output.

ottimo. questo era il redirection. poi c'è il pipe ("|"). il pipe viene
usato per inviare lo standard output di un comando allo standard input di un
altro. per esempio "cat /etc/passwd |grep root". in questo modo l'output del
comando "cat /etc/passwd" verrà inviato all'input del comando "grep root", e
ti visualizzerà sullo schermo solo le righe del file contenenti la parola
"root".

bè.... questo è quanto... ulteriori chiarimenti li rimando alla prossima
riunione (penso sia domani, ma non so se vengo).

bye
S2

Ma non devi studiare :slight_smile:

Aggiungo anche il chiarimento della versione consigliata da me, e cioè
wvdial > test.log 1>&2

che è un redirect del stdout del prog wvdial nel file test.log e poi c'è
il redirect del stdout su stderr, così il primo redirect conterrà anche
il stderr. Questa versione ha il vantaggio che ho 2 canali (stderr e
stdout) in un file e che sono syncroni.

Daidai, vieni ben domani!!

byez pazzo

s2-(a)iname.com wrote:

Hops ovviamente non è 1>&2 ma 2>&1 scusate!

cioè:
wvdial > test.log 2>&1

byez pazzo

pohnewein(a)prodata.it wrote:

pazzo$ echo 'Fuck' | grep u 1>&0
grep: schreibe Ausgabe: Ungültiger Dateideskriptor

Volevo fare un bel loop ma non si puo fare il redirect di un canale
output su un canale input.

byez pazzo

pohnewein(a)prodata.it wrote:

Ma non devi studiare :slight_smile:

Sai prima cerco di risolvere con la mia testa, e poi chiedo...

Daidai, vieni ben domani!!

Vengo oggi alle ore 21 al solito cinese

A piu` tardi allora!!

Bisognerebbe ricordare a tutti non membri del direttivo che ANCHE LORO SONO INVITATI!!!!!!

by

sepp

Grazie a tutti, ora funzia...

sepp

haha, io dicevo ad S2!

a sta sera, fra poco!

byez pazzo

act.ja(a)activenetwork.it wrote: