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
:
-e Exit immediately if a command exits with a non-zero status.
Maar het wordt door sommigen als een slechte gewoonte beschouwd (bash FAQ en irc freenode #bash FAQ auteurs). Het wordt aanbevolen om te gebruiken:
trap 'do_something' ERR
om de do_something
functie uit te voeren als er fouten optreden.
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. Typ help 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:
trap onexit EXIT
waarbij onexit
je functie is om iets bij exit te doen, zoals hieronder die de eenvoudige stack trace afdrukt:
onexit(){ while caller $((n++)); do :; done; }
Er is een vergelijkbare optie -E
/errtrace
die in plaats daarvan een val op ERR maakt, bijv:
trap onerr ERR
Nul status voorbeeld:
$ true; echo $?
0
Niet-nul status voorbeeld:
$ false; echo $?
1
Negerende status voorbeelden:
$ ! false; echo $?
0
$ false || true; echo $?
0
Test met pipefail
wordt uitgeschakeld:
$ bash -c 'set +o pipefail -e; true | true | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; false | false | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; true | true | false; echo success'; echo $?
1
Test met pipefail
is ingeschakeld:
$ bash -c 'set -o pipefail -e; true | false | true; echo success'; echo $?
1