Hvordan Linux avgangskoder hjelper deg med å skrive robuste skript

Lær hvordan Linux-utgangskoder fungerer for å håndtere kommandoer, feilhåndtering og styring av skripter effektivt med spesifikke variabler og kontrollstrukturer.
Oppsummering
- Hver Linux-kommando returnerer en utgangskode, der 0 indikerer suksess og ikke-null verdier indikerer feil.
- Du kan bruke variabelen $? for å få tilgang til utgangskoden og kontrollere programflyten i skriptene dine.
- Vær oppmerksom på uvanlige utgangskoder som varierer mellom kommandoer, som diff og curl.
Hver Linux-kommando vil skrive ut feilmeldinger hvis den mislykkes, men denne informasjonen er vanskelig å stole på. Skriptene dine bør bruke utgangskoder for å være så robuste som mulig.
Hva Er Utgangskoder?
Når du kjører en Linux-kommando, kan den mislykkes. Ting kan gå galt av ulike grunner, men du vil vanligvis se en melding som forklarer hvorfor:
Feilmeldingen du ser vises på STDERR, en annen strøm enn STDOUT, som lar deg isolere feil fra forventet utdata. Som bruker bør en beskrivelse av feilen være informativ, men skript og andre automatiserte prosesser trenger å vite om feil mer pålitelig.
Sammen med lesbare feilmeldinger returnerer hver kommando også en utgangskode. Dette er et tall mellom 0 og 255 som indikerer om kommandoen mislyktes eller lyktes. Som standard er utgangskoden skjult, men skallet ditt gir tilgang til denne verdien i den spesielle variabelen, $?
Vær oppmerksom på at en verdi på 0 indikerer suksess og en ikke-null verdi betyr feil. Du kan sjekke denne verdien på kommandolinjen, undersøke den i et skript, og bruke den til å kontrollere flyten i programmene dine.
Hvordan Bruker Jeg Utgangskoder?
I eksempelet ovenfor returnerte ls en utgangskode på 0 når det lyktes og en 1 når argumentet ikke var en gyldig fil. Dette kan virke kontraintuitivt, og det motsier typiske programmeringsspråk som behandler 0 som en falsk verdi og 1 som sann. Imidlertid tillater denne oppsettet en enkelt, universell suksessverdi og et bredt spekter av verdier for å representere forskjellige feiltyper.
I tillegg til å ekko $? variabelen for manuelt å sjekke utgangsstatus, kan du bruke den med en betinget if-setning. Hvis kommandoen returnerer en 0 utgangsstatus, vil setningen kjøre den tilknyttede da-blokken. Ellers, hvis det finnes en, vil den kjøre else-blokken. For eksempel:
if command; then echo "kommandoen lyktes"; else echo "kommandoen mislyktes"; fi
Du kan bruke denne konstruksjonen i et skallskript, hvor det er litt lettere å formatere for lesbarhet:
if command
then echo "kommandoen lyktes"
else echo "kommandoen mislyktes"
fi
Dette er ekvivalent med:
command
if [ $? -eq 0 ]
then echo "kommandoen lyktes"
else echo "kommandoen mislyktes"
fi
Den lengre versjonen bruker firkantparentessyntaks for å teste verdien av $?, men det er vanligvis lettere å teste verdien direkte, som i det første tilfellet. Husk at $? alltid representerer utgangskoden fra den siste kommandoen, så vær forsiktig. Du kan bli fristet til å skrive ut verdien av $? for feilsøking, f.eks.
command
echo "kommandoen returnerte utgangskode:" $?
if [ $? -eq 0 ]
then echo "kommandoen lyktes"
else echo "kommandoen mislyktes"
fi
Men, på tidspunktet for betingelsessjekken, vil $? ha verdien av echoes utgangsstatus, som nesten garantert er 0. For å unngå dette, test enten kommandoen direkte i betingelsen eller lagre verdien av $? i en variabel.
Hva Annet Er Det Å Vite Om Utgangsstatus?
Utgangskoder er ganske enkle, og følger Unix-prinsippet, og dette er en del av deres kraft. Men det er noen fallgruver og unntakstilfeller du bør være klar over.
Utgangskoder Fra Skallet Ditt
Skallet ditt vil bruke utgangskoder selv når kommandoen du skriver ikke kjører korrekt. For eksempel bruker zsh og bash 127 hvis kommandoen ikke finnes og 126 hvis kommandoen ikke er kjørbar:
Uvanlige Utgangskoder
Noen kommandoer bøyer reglene for utgangsstatus litt; de er egentlig bare konvensjoner, uansett. For eksempel bruker diff en 0-verdi for å bety "ingen forskjeller," en verdi på 1 for å bety "forskjeller," og en verdi på 2 for å representere en feil:
Dette kan forvirre betydningen av betingelser; for eksempel:
if diff file1 file2; then
echo disse filene er like!
fi
Curl-kommandoen er også litt intuitiv. Du ville kanskje forvente at curl rapporterer en HTTP-feil, som en 404 for en ikke-eksisterende.
URL, som en ikke-null statuskode, men det gjør den ikke:
Du kan bruke -f (--fail) alternativet for å få curl til å oppføre seg annerledes, og returnere en avslutningskode på 22 ved feil:
Vær imidlertid oppmerksom på at dette ikke er 100 % garantert, og noen HTTP-feil, inkludert de som krever godkjenning, vil fortsatt returnere en 0 avslutningskode.
Bruke Avslutningsstatus i en Kommando Kjede
En av de beste snarveiene for avslutningsstatus skjer uten at du engang trenger å tenke på det. Her er et enkelt eksempel:
ls program && ./program && echo success || echo epic fail
De logiske operatorene && og || tillater deg å kjøre mer enn én kommando basert på avslutningsstatusen til andre. De ligner på de tilsvarende operatorene i de fleste programmeringsspråk, men de respekterer konvensjonen for avslutningskoder. && operatoren vil kjøre kommandoen til høyre kun hvis kommandoen til venstre returnerer en 0 avslutningsstatus. || operatoren vil kjøre kommandoen til høyre kun hvis kommandoen til venstre feiler med en ikke-null status.
Et veldig vanlig tilfelle oppstår når du bygger programvare fra bunnen av, ved å bruke denne oppskriften:
./configure && make && make install
De tre delene i denne kommandoen gjør følgende:
- ./configure kjører et lokalt skript som inspiserer miljøet ditt og genererer en Makefile.
- make kjører make-programmet og bygger programvaren, ved å bruke Makefile.
- make install kopierer den genererte eksekverbare filen til et kjent sted som /usr/local/bin.
Dersom noen del av denne prosessen feiler, stopper den umiddelbart uten å prøve resten.
De Sanne og Falske Kommandoene
Linux-systemet ditt inkluderer to nysgjerrige kommandoer: true og false. Hver av disse gjør ingenting, bortsett fra å returnere en passende avslutningskode: 0 og 1 henholdsvis:
De ser kanskje ikke veldig nyttige ut, men disse kommandoene er praktiske for testing og for noen oppgaver med skallscripting. Du kan bruke true i en while-setning for å lage en uendelig løkke:
while true
do
echo “kjører til du ^c”
sleep 10
done
Du kan også bruke dem sammen med logiske operatorer for å endre oppførselen til kommandoer. For eksempel kan du midlertidig stoppe en lang kommando kjede fra å kjøre:
false && (none || of-these && commands || will-run)
Eller du kan tvinge en kommando kjede til å fortsette å kjøre, selv om én kommando feiler:
cat file-that-may-not-exist | true && echo done
Returnere en Avslutningskode Fra Dine Egne Skript
Du har sannsynligvis brukt exit-kommandoen før, for å avslutte terminalen din. Teknisk sett avslutter det skallet ditt, og dette betyr at du også kan bruke det for å stoppe et skallskript. Som standard vil skriptene dine avslutte med samme kode som den siste kommandoen:
Men du kan endre avslutningskoden ved å sende et numerisk parameter til exit-kommandoen:
exit number
Skriptene dine vil nå avslutte med statuskoden du oppga, og du kan bruke dette for å kommunisere forskjellige feiltilstander fra programmet ditt til andre.
Når du først vet om dem, er exit-kommandoene enkle å bruke. Du kan til og med bruke dem uten egentlig å tenke over det, men når det kommer til scripting, sørg for at du bruker avslutningskoder på en passende måte.
Hvis du vil lese flere artikler som Hvordan Linux avgangskoder hjelper deg med å skrive robuste skript, kan du besøke kategorien Linux.
Legg igjen en kommentar