[#!/bin/sh] exit value controleren

Pagina: 1
Acties:

  • sphere
  • Registratie: Juli 2003
  • Laatst online: 22:11

sphere

Debian abuser

Topicstarter
Ik heb een script, dat er ongeveer zo uit ziet:
Bash:
1
2
3
4
5
6
7
8
9
10
#!/bin/sh

$PYTHON baa

if [ $? -eq 0 ]
then
echo "foo"
else
echo "bar"
fi


Door in het python script nu sys.exit(1) aan te roepen wanneer er iets spaak loopt, kun je dat in je shell script dus terugvinden, aangezien "$?" deze waarde checkt. Of toch niet...? Ik heb een probleem waarbij hetzelfde script op een Sun bar teruggeeft, maar op een HP foo.

Is het gegarandeerd dat ik de exit value van $PYTHON foo terugvind in $?, of kan dat nog ergens misgaan? Op het internet vind ik eigenlijk nergens voorbeelden waar mensen de moeite nemen om die waarde ergens op te slaan en in een vergeeld UNIX scripting boek dat ik er op nageslagen heb ook niet.

Wel staat er een suggestie in dat boek om de waarde op te slaan in een file en die te sourcen, maar dat is in verband met remote shells. Dus wat ik eigenlijk weten wil: is het denkbaar dat de exit value niet in $? staat? Ik ben hier gewoon nieuwsgierig naar.

[ Voor 3% gewijzigd door sphere op 16-05-2007 20:28 ]

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454


  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 01-02 13:45

deadinspace

The what goes where now?

Allereerst, is het niet mogelijk dat je python script op de Sun bak faalt, maar op de HP bak succesvol is?

En verder, probeer eens
code:
1
2
3
4
5
#!/bin/sh

$PYTHON baa
R=$?
echo ${R}


Oh, en om je vraag te beantwoorden: bij mijn weten is het gedrag van $? vastgelegd in de POSIX specificatie voor Bourne-compatible shells, dus ja, die hoort gewoon altijd de exit value te bevatten.

[ Voor 34% gewijzigd door deadinspace op 16-05-2007 21:17 ]


  • sphere
  • Registratie: Juli 2003
  • Laatst online: 22:11

sphere

Debian abuser

Topicstarter
deadinspace schreef op woensdag 16 mei 2007 @ 21:15:
Allereerst, is het niet mogelijk dat je python script op de Sun bak faalt, maar op de HP bak succesvol is?
Ik weet wat de uitkomst MOET zijn, het is een test die gemaakt is om te falen. De HP bak heeft het bij het foute eind (false positive).
En verder, probeer eens
code:
1
2
3
4
5
#!/bin/sh

$PYTHON baa
R=$?
echo ${R}


Oh, en om je vraag te beantwoorden: bij mijn weten is het gedrag van $? vastgelegd in de POSIX specificatie voor Bourne-compatible shells, dus ja, die hoort gewoon altijd de exit value te bevatten.
Natuurlijk bevat het de exit value. Het is alleen de vraag of het de exit value bevat van de vorige regel in mijn script, of dat er stiekum iets tussen kan piepen, bijv. als het proces gekilld wordt (ik noem maar wat).

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454


  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 01-02 13:45

deadinspace

The what goes where now?

Hmm, ik dacht even dat het misschien kwam omdat de return value van '[' ertussen kwam. '[' is namelijk een losse executable (doe maar eens 'man ['. Ook beschikbaar onder de naam 'test'), maar bij veel shells is het ook een builtin die voorrang krijgt. Maar bij nader inzien is dat onzin, aangezien de evaluatie van de '$?' in je script plaatsvindt voordat '[' wordt uitgevoerd.

Ik zou dus graag weten of het scriptje dat ik gaf op zowel de HP bak als op de Sun bak 1 returnt. Als dat zo is, dan werkt dat blijkbaar goed, en dan is het de vraag waar het probleem wel zit.

Overigens, nu ik erover nadenk, je zou je scriptje ook zo kunnen schrijven:
code:
1
2
3
4
5
6
if $PYTHON baa
then
    echo "foo"
else
    echo "bar"
fi

(maar zelfs al werkt dat wel, dan ben ik nog benieuwd waar het probleem nou zit in je originele scriptje)

edit:
Oh, ik brabbel telkens maar wat en vergeet antwoord te geven op je feitelijke vragen :P
sphere schreef op woensdag 16 mei 2007 @ 21:44:
Het is alleen de vraag of het de exit value bevat van de vorige regel in mijn script
Voorzover ik weet bevat $? de exitvalue van de laatst uitgevoerde executable (danwel builtin).
of dat er stiekum iets tussen kan piepen, bijv. als het proces gekilld wordt (ik noem maar wat).
Nee, dat kan bij mijn weten niet.

[ Voor 23% gewijzigd door deadinspace op 16-05-2007 23:44 ]


Verwijderd

sphere schreef op woensdag 16 mei 2007 @ 20:24:
Bash:
1
2
3
4
5
6
7
8
9
10
#!/bin/sh

$PYTHON baa

if [ $? -eq 0 ]
then
echo "foo"
else
echo "bar"
fi


Door in het python script nu sys.exit(1) aan te roepen wanneer er iets spaak loopt, kun je dat in je shell script dus terugvinden, aangezien "$?" deze waarde checkt. Of toch niet...? Ik heb een probleem waarbij hetzelfde script op een Sun bar teruggeeft, maar op een HP foo.
Moet dat niet "test $? -eq 0" zijn? :?. Dat is in sh niet implied (in bash wel). Kan zijn dat de hele test dus uberhaupt niet uitgevoerd wordt (OS-dependent) en dat het daarom dus vreemde resulaten geeft.

  • sphere
  • Registratie: Juli 2003
  • Laatst online: 22:11

sphere

Debian abuser

Topicstarter
Aha, dat wist ik niet. Zodra ik kan zal ik het testen. Bedankt voor de vingerwijzing.

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454

Pagina: 1