Sunt confuz cu privire la semnificația codului de ieșire la sfârșitul unui script bash: știu acel cod de ieșire 0 înseamnă că s-a terminat cu succes și că există multe alte numere de coduri de ieșire (127 dacă „nu mă înșel?)
Întrebarea mea este despre când se vede codul de ieșire 0 la sfârșitul unui script, nu forțează codul de ieșire ca 0 chiar dacă scriptul a eșuat sau are alt sens?
Comentarii
Răspuns
Comanda încorporată exit
iese din shell (din Bash „s referință ):
exit [n]
Ieșiți din shell, returnând o stare de n către părintele shell-ului. Dacă n este omis, starea de ieșire este cea a ultimei comenzi executate. Orice captură la EXIT este executată înainte ca shell-ul să se termine.
Rularea până la sfârșitul fișierului iese și returnează codul de returnare al ultimei comenzi, deci da, un exit 0
final va face ca ieșirea scriptului să aibă succes, indiferent de starea de ieșire a comenzile anterioare. (Adică, presupunând că scriptul ajunge la exit
final.) La sfârșitul unui script, puteți utiliza și true
sau pentru a obține un cod de ieșire de la zero.
Desigur, mai des ai folosi exit
din interiorul unui if
pentru a termina scriptul în mijloc.
Acestea ar trebui să imprime un 1 ($?
conține codul de ieșire returnat de comanda anterioară) :
sh -c "false" ; echo $? sh -c "false; exit" ; echo $?
În timp ce acest lucru ar trebui să imprime un 0:
sh -c "false; exit 0" ; echo $?
Eu nu sunt sigur dacă conceptul scriptului „eșuează” la executarea unui exit
are sens, deoarece este posibil ca unele comenzi rulate de script să eșueze, dar scriptul în sine să reușească . Depinde de autorul scriptului să decidă ce este un succes și ce nu.
De asemenea, gama standard pentru codurile de ieșire este 0..255. Codurile de peste 127 sunt utilizate de către shell pentru a indica un proces încheiat de un semnal, dar pot fi returnate în mod obișnuit. Apelul de sistem wait
returnează de fapt o valoare mai largă, restul conținând biți de stare setați de sistemul de operare.
Comentarii
- Mișto, nu ' nu știam despre numerotarea codurilor de ieșire pe 8 biți. Mulțumim!
- Rețineți că, atunci când un proces este ucis, acesta nu iese cu un cod de ieșire > 127. Acesta ' s doar că unele cochilii au setat
$?
la 128 + semnum în acest caz. Consultați Cod de ieșire implicit când procesul este încheiat? pentru detalii. -
exit 0
va reveni numai 0, dacă ieșirea este executată. (ar putea ieși pe o altă rută).
Răspuns
0 înseamnă succes, numere întregi pozitive înseamnă eșec. Există 255 de coduri de eroare diferite, dar valorile 126 și mai sus sunt rezervate pentru a indica faptul că un program nu a putut începe (126 sau 127) sau a fost ucis de un semnal (129 și mai sus). Consultați Cod de ieșire implicit când procesul este încheiat? și Ce valori de returnare / ieșire pot folosi în funcțiile / scripturile bash? pentru mai multe informații.
Starea de ieșire a unui script shell este starea de ieșire a ultimei comenzi executate de script. Deci, de exemplu,
#!/bin/sh somecommand
returnează starea de ieșire a somecommand
, în timp ce
#!/bin/sh somecommand exit 0
returnează 0 indiferent de ceea ce somecommand
s-a întors.Acest al doilea script ar putea fi, de asemenea, scris
#!/bin/sh somecommand true
Punerea exit 0
la sfârșitul unui script nu cauzează neapărat returnează 0. Acest lucru îl face să returneze doar 0 când se ajunge la sfârșitul scriptului. De exemplu, următorul script returnează întotdeauna 3:
#!/bin/sh exit 3 exit 0
următorul script returnează întotdeauna un cod de eroare, pe lângă afișarea unui mesaj despre o eroare de sintaxă:
#!/bin/sh } exit 0
Următorul script returnează fie 1, fie 0 în funcție de primul argument:
#!/bin/sh if [ "$1" = "foo" ]; then exit 1 fi exit 0
Următorul script returnează starea somecommand
, deoarece set -e
determină ieșirea scriptului dacă somecommand
eșuează:
#!/bin/sh set -e somecommand exit 0
exit 0
, va ieși cu codul de ieșire 0 indiferent de ceea ce se întâmplă în script.exit 0
, acesta va ieși cu codul 0 numai dacă ultima instrucțiune a fost executată. Singurul impact alexit 0
la sfârșitul scriptului este de a returna 0 în loc de starea din instrucțiunea anterioară.exit 0
în orice moment, acesta va returna codul de ieșire 0 indiferent de ceea ce s-a întâmplat anterior.