Es pētau šī preinst faila saturu, ko skripts izpilda, pirms šī pakete tiek izpakota no Debian arhīva (.deb) faila.
Skripta kods ir šāds:
#!/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
Mans pirmais jautājums ir par rindu:
set -e
Es domāju, ka pārējais skripta saturs ir diezgan vienkāršs: Tas pārbauda, vai Debian/Ubuntu pakešu pārvaldnieks veic instalēšanas operāciju. Ja tā ir, tas pārbauda, vai mana lietojumprogramma ir tikko instalēta sistēmā. Ja tā ir, skripts izdrukā ziņojumu "MyApplicationName is just installed" un beidzas (return 1
nozīmē, ka tas beidzas ar "kļūdu", vai ne?).
Ja lietotājs lūdz Debian/Ubuntu pakotņu sistēmai instalēt manu pakotni, skripts izdzēš arī divus direktorijus.
Vai tas ir pareizi, vai arī es kaut ko palaidu garām?
No help set
:
-e Exit immediately if a command exits with a non-zero status.
Bet daži (bash FAQ un irc freenode #bash FAQ autori) to uzskata par sliktu praksi. Ieteicams lietot:
trap 'do_something' ERR
lai palaistu do_something
funkciju, ja rodas kļūdas.
set -e
aptur skripta izpildi, ja komandai vai cauruļvadam ir kļūda - tas ir pretēji čaulas noklusējuma uzvedībai, kas paredz ignorēt kļūdas skriptos. Lai apskatītu šīs iebūvētās komandas dokumentāciju, terminālī ierakstiet help set
.
Saskaņā ar bash - The Set Builtin rokasgrāmatu, ja ir iestatīts -e
/errexit
, apvalks nekavējoties izbeidz darbību, ja cauruļvads, kas sastāv no vienas vienkāršas komandas, saraksta vai saliktas komandas, atgriež nenulles statusu.
Pēc noklusējuma cauruļvada izejas statuss ir pēdējās cauruļvada komandas izejas statuss, ja vien nav iespējota opcija pipefail
(pēc noklusējuma tā ir atspējota).
Tādā gadījumā atgriešanās statuss ir pēdējās (vistālāk pa labi) komandas, kas iziet ar nenulles statusu, vai nulle, ja visas komandas iziet veiksmīgi.
Ja vēlaties kaut ko izpildīt izejas brīdī, mēģiniet definēt, piemēram, trap
:
trap onexit EXIT
kur onexit
ir jūsu funkcija, kas veic kaut ko izejas brīdī, piemēram, kā zemāk, kas izdrukā vienkāršu stack trace:
onexit(){ while caller $((n++)); do :; done; }
Pastāv līdzīga opcija -E
/errtrace
, kas tā vietā izseko pie ERR, piem:
trap onerr ERR
Nulles statusa piemērs:
$ true; echo $?
0
Nenulles statusa piemērs:
$ false; echo $?
1
Nēgējošā statusa piemēri:
$ ! false; echo $?
0
$ false || true; echo $?
0
Tests ar pipefail
ir atspējots:
$ 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
Tests ar iespējotu pipefail
:
$ bash -c 'set -o pipefail -e; true | false | true; echo success'; echo $?
1