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?

Oplossing

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.

Zie http://mywiki.wooledge.org/BashFAQ/105

Commentaren (13)

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.

Commentaren (2)

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

Voorbeelden

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
Commentaren (0)