Entra

View Full Version : [Bash] Variabili locali


Unrue
21-01-2010, 18:27
Ciao a tutti,
non capisco perché il seguente script non funziona. In pratica, lancio uno script esterno che ritorna un valore, faccio il check di tale valore ma questo check fallisce sempre:confused: , anche se il valore ritornato è 0



#!/bin/bash

{
. /home/mionome/Scrivania/script_2
res=$?
} 2>&1 | tee -a "/home/mionome/Scrivania/build_output"


if [ "$res" = "0" ] ; then

export BUILD_RESULTS=success
echo $BUILD_RESULTS > /home/mionome/Scrivania/build_results


else

export BUILD_RESULTS=failed
echo $BUILD_RESULTS > /home/mionome/Scrivania/build_results

exit 1
fi



Se provo a stampare res all'uscita del blocco è vuota. Se invece definisco res=0 ad esempio all'inizio dello script, il res nel blocco non modifica quello definito inizialmente :muro:

zuper
21-01-2010, 18:39
perchè hai usato le graffe?

Unrue
21-01-2010, 18:43
perchè hai usato le graffe?

Per conservare lo stato del make dentro la pipe, altrimenti catturerei lo stato di uscita del tee sovrascrivendo quello del make

zuper
21-01-2010, 18:50
Per conservare lo stato del make dentro la pipe, altrimenti catturerei lo stato di uscita del tee sovrascrivendo quello del make

e devi proprio reindirizzarlo col | tee?

Unrue
21-01-2010, 18:51
e devi proprio reindirizzarlo col | tee?

Evidentemente si..

zuper
21-01-2010, 19:03
Evidentemente si..

ok allora nn capisco cosa devi ottenere...sorry ;)

Unrue
21-01-2010, 19:05
ok allora nn capisco cosa devi ottenere...sorry ;)

Devo preservare lo stato di uscita dello script lanciato nelle parentesi graffe. Faccio poi un check in base al valore di ritorno dello script. Solo che fallisce sempre. Se tolgo le parentesi graffe ed il " | tee" funziona, ma ne ho bisogno e non posso toglierle.

zuper
21-01-2010, 19:08
Devo preservare lo stato di uscita dello script lanciato nelle parentesi graffe. Faccio poi un check in base al valore di ritorno dello script. Solo che fallisce sempre. Se tolgo le parentesi graffe ed il " | tee" funziona, ma ne ho bisogno e non posso toglierle.

ma il tee lo utilizzi per reindirizzare lo stdout e nel mentre visualizzarlo a video, se il risultato dello script è solo l'exit status nn puoi loggare tutto con > e poi eventualmente fare un echo di $res?

Unrue
22-01-2010, 09:38
ma il tee lo utilizzi per reindirizzare lo stdout e nel mentre visualizzarlo a video, se il risultato dello script è solo l'exit status nn puoi loggare tutto con > e poi eventualmente fare un echo di $res?

Si, in effetti potrei fare anche così. Però mi piacerebbe capire come mai nel modo precedente non funziona :confused:

zuper
22-01-2010, 09:44
scusa la domanda...ma lo script te lo fa girare lo stesso o salta banalmente le parentesi??

Unrue
22-01-2010, 11:04
scusa la domanda...ma lo script te lo fa girare lo stesso o salta banalmente le parentesi??

No non le salta le parentesi. Comunque la tua soluzione non è la stessa cosa. Non fa quello che fa il tee.

Credo di aver capito il motivo. In pratica, quando fai la pipe, lui forka sia il primo comando che il secondo, creando due processi, quindi la variabile res è locale solo al primo processo. Addirittura penso si debbano usare i coproc..

zuper
22-01-2010, 11:20
bisognerebbe capire meglio che output a video ti deve dare il comando :)

Unrue
22-01-2010, 11:30
bisognerebbe capire meglio che output a video ti deve dare il comando :)

Beh, vorrei stampare l'output dello script che lancio (. /home/mionome/Scrivania/script_2 ) a video e contemporaneamente in un file, appunto quello che fa tee

zuper
22-01-2010, 11:57
sto facendo delle prove....ma ora pappa...
dopo spero di tornare con qualcosa di + concreto.....