Cod de ieșire la sfârșitul unui script bash

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

  • Dacă un script se termină cu exit 0, va ieși cu codul de ieșire 0 indiferent de ceea ce se întâmplă în script.
  • @Hatclock de ce nu ' Nu postezi răspunsul tău ca răspuns complet angajat? Ca comentariu, nu-l pot marca și nu cred că ' nu cred că primești puncte de internet false pentru a răspunde (nu?) Doar un gând. .. (felicitări pentru răspunsul rapid)
  • Mă ' m la o gară de pe telefonul meu, nu chiar îmi place să scriu prea mult pe telefonul meu. Totuși, ilkkachu pare să aibă un răspuns bun!
  • @Hatclock Nu, deloc. Dacă un script se termină cu exit 0, acesta va ieși cu codul 0 numai dacă ultima instrucțiune a fost executată. Singurul impact al exit 0 la sfârșitul scriptului este de a returna 0 în loc de starea din instrucțiunea anterioară.
  • @Gilles Aceasta a fost mai mult o ambiguitate răspuns formulat din partea mea. Dacă un script rulează exit 0 în orice moment, acesta va returna codul de ieșire 0 indiferent de ceea ce s-a întâmplat anterior.

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 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *