Bash - stdout e stderr su 2 variabili [messaggio #40541] |
mar, 19 luglio 2011 21:41 |
BIG (Umberto) Messaggi: 9 Registrato: luglio 2011 |
Junior Member |
|
|
Curiositá.
Stavo pastrocciando con zenity per avere una interfaccia grafica al comando
zbarimg (decodificatore di qr-code).
Mi serviva avere 2 finestre diverse, a seconda se il comando era eseguito su
una immagine valida oppure una finestra con l'errore di decodifica.
Per ora ho risolto leggendo lo stato di errore in uscita e richiamando una
seconda volta zbarimg reindirizzando stderr su stdout.
QR=$(zbarimg -q $filescelto)
e se $? da un valore diverso da zero:
error=$(zbarimg -v $filescelto 2>&1)
Pensavo di riuscire ad ottenere il tutto con un solo passaggio (utile anche per
eventuali altri casi).
Googlando non ne sono venuto a capo.
--
+----------------------------------------------------------- ----------------+
| Sappi che la mia spocchiosita' depressiva con pulsione |
| all'autodemolizione e' allo studio di menti brillanti del mondo della |
| psichiatria. Hanno promesso di spiegarmi che cosa ho detto. |
+-----#17--------------------Campagna contro le pubblicita` idiote.---------+
|
|
|
|
|
|
|
Re: Bash - stdout e stderr su 2 variabili [messaggio #40564 è una risposta a message #40562] |
mer, 20 luglio 2011 22:38 |
Alessandro Selli Messaggi: 242 Registrato: novembre 2010 |
Senior Member |
|
|
BIG (Umberto) ha scritto:
[...]
> Potesse essere (sono su debian)?
> big@debian:/tmp$ bash --version
> GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu)
> Copyright (C) 2007 Free Software Foundation, Inc.
No, ho sbagliato io. L'esempio che ho copincollato sembrava
funzionare perché la variabile STDIN (che, tra parentesi, avrei dovuto
chiamare STDOUT) era stata inizializzata al valore "pippo" da una
precedente prova. In realtà quello che succede nel codice che segue:
STDOUT=$(ls pippo pluto 2> stderr) & STDERR=$(cat stderr)
è che il comando di attribuzione di valore a variabile STDOUT=$(ls pippo
pluto 2> stderr) & , eseguito in background, è eseguito in una
sottoshell mandata automaticamente in esecuzione dalla shell in cui è
eseguito lo script (o la shell del terminale, se il comando è eseguito
in modalità interattiva). Essendo le variabili confinate ad esistere
solamente nella shell in cui sono generate o, nel caso delle variabili
esportate, in quelle figlie ma mai in quelle genitrici, il valore di
STDOUT è perso.
Non mi viene in mente soluzione senza usare un file temporaneo al
posto della named pipe, quindi come rimedio ho da proporre solo queste
modifiche al tuo script adesso:
#!/bin/bash
clear
touch pippo
echo
STDOUT=$(ls pippo pluto 2> stderr)
status=$?
STDERR=$(< stderr)
echo status=$status
echo ===[$STDERR]
echo ===[$STDOUT]
echo
rm stderr
Ciao,
--
Alessandro Selli http://alessandro.route-add.net
AVVERTENZA: i messaggi inviati a "trappola" non mi arriveranno.
WARNING: messages sent to "trappola" will never reach me.
|
|
|
Re: Bash - stdout e stderr su 2 variabili [messaggio #40565 è una risposta a message #40564] |
mer, 20 luglio 2011 23:02 |
BIG (Umberto) Messaggi: 9 Registrato: luglio 2011 |
Junior Member |
|
|
Alessandro Selli in data Wednesday 20 July 2011 22:38, nel gruppo
it.comp.os.linux.iniziare ha scritto:
> No, ho sbagliato io. L'esempio che ho copincollato sembrava
> funzionare perché la variabile STDIN (che, tra parentesi, avrei dovuto
> chiamare STDOUT) era stata inizializzata al valore "pippo" da una
> precedente prova. In realtà quello che succede nel codice che segue:
> Non mi viene in mente soluzione senza usare un file temporaneo al
> posto della named pipe, quindi come rimedio ho da proporre solo queste
> modifiche al tuo script adesso:
Che risolve il problema, ed inoltre permette di avere il result status utile
per sapere come comportarsi.
Ottimo!
Grazie!!!!
--
+----------------------------------------------------------- ----------------+
| Avevo un lavoro, un posto fisso che mi rendeva bene e ci mantenevo tutta |
| la famiglia. Poi un giorno e' arrivato un tale, che mi ha detto: |
| Lazzaro, alzati e cammina! Da quel momento ho perso il posto, il lavoro e |
| sono finito in miseria. |
+-----#30--------------------Campagna contro le pubblicita` idiote.---------+
|
|
|
Re: Bash - stdout e stderr su 2 variabili [messaggio #40611 è una risposta a message #40564] |
sab, 23 luglio 2011 19:37 |
BIG (Umberto) Messaggi: 9 Registrato: luglio 2011 |
Junior Member |
|
|
Alessandro Selli in data Wednesday 20 July 2011 22:38, nel gruppo
it.comp.os.linux.iniziare ha scritto:
> Non mi viene in mente soluzione senza usare un file temporaneo al
> posto della named pipe, quindi come rimedio ho da proporre solo queste
> modifiche al tuo script adesso:
>
> #!/bin/bash
> clear
> touch pippo
> echo
> STDOUT=$(ls pippo pluto 2> stderr)
> status=$?
> STDERR=$(< stderr)
> echo status=$status
> echo ===[$STDERR]
> echo ===[$STDOUT]
> echo
> rm stderr
Meglio a questo punto mettere all'inizio:
TMPFILE=$(mktemp)
ed usare al posto di stderr, $TMPFILE
--
+----------------------------------------------------------- ----------------+
| LA FIGA E' IL POSTO PIU' PULITO DEL MONDO PERCHE' CI SCOPANO TUTTI.. |
| MA ANCHE IL POSTO PIU' SERIO DEL MONDO |
+-----#36--------------------Campagna contro le pubblicita` idiote.---------+
|
|
|