Wat betekent set -e in een bash script?
Ik'ben de inhoud van dit preinst bestand aan het bestuderen dat het script uitvoert voordat dat pakket wordt uitgepakt uit zijn Debian archief (.deb) bestand.
Het script heeft de volgende code:
#!/bin/bash
set -e
# Automatically added by dh_installinit
if [ "$1" = install ]; then
if [ -d /usr/share/MyApplicationName ]; then
echo "MyApplicationName is just installed"
return 1
fi
rm -Rf $HOME/.config/nautilus-actions/nautilus-actions.conf
rm -Rf $HOME/.local/share/file-manager/actions/*
fi
# End automatically added section
Mijn eerste vraag gaat over de regel:
set -e
Ik denk dat de rest van het script vrij eenvoudig is: Het controleert of de Debian/Ubuntu pakketbeheerder een installatie uitvoert. Als dat zo is, controleert het of mijn applicatie zojuist op het systeem is geïnstalleerd. Als dat het geval is, drukt het script de boodschap "MyApplicationName is net geïnstalleerd" af en eindigt (return 1
betekent dat het eindigt met een "fout", nietwaar?).
Als de gebruiker het Debian/Ubuntu package systeem vraagt om mijn package te installeren, verwijdert het script ook twee directories.
Is dit juist of mis ik iets?
Van
help set
:Maar het wordt door sommigen als een slechte gewoonte beschouwd (bash FAQ en irc freenode #bash FAQ auteurs). Het wordt aanbevolen om te gebruiken:
om de
do_something
functie uit te voeren als er fouten optreden.Zie http://mywiki.wooledge.org/BashFAQ/105
set -e
stopt de uitvoering van een script als een commando of pijplijn een fout heeft - dit is het tegenovergestelde van het standaard shell gedrag, dat is om fouten in scripts te negeren. Typhelp set
in een terminal om de documentatie voor dit ingebouwde commando te bekijken.Volgens de bash - The Set Builtin handleiding, als
-e
/errexit
is ingesteld, verlaat de shell onmiddellijk als een pijplijn bestaande uit een enkel eenvoudig commando, een lijst of een samengesteld commando een niet-nul status retourneert.Standaard is de uitgangsstatus van een pijplijn de uitgangsstatus van het laatste commando in de pijplijn, tenzij de
pipefail
optie is ingeschakeld (deze is standaard uitgeschakeld).Als dat het geval is, geeft de pijplijn'de uitgangsstatus van het laatste (meest rechtse) commando dat met een niet-nulstatus afsluit, of nul als alle commando's met succes afsluiten.
Als je'iets zou willen uitvoeren bij exit, probeer dan bijvoorbeeld
trap
te definiëren:waarbij
onexit
je functie is om iets bij exit te doen, zoals hieronder die de eenvoudige stack trace afdrukt:Er is een vergelijkbare optie
-E
/errtrace
die in plaats daarvan een val op ERR maakt, bijv:Voorbeelden
Nul status voorbeeld:
Niet-nul status voorbeeld:
Negerende status voorbeelden:
Test met
pipefail
wordt uitgeschakeld:Test met
pipefail
is ingeschakeld: