Řešení 1:
set -e
způsobí ukončení shellu, pokud jakýkoli dílčí příkaz nebo kanál vrátí nenulový stav.
Odpověď, kterou tazatel pravděpodobně hledal, je:
Bylo by nebezpečné používat "set -e" při vytváření skriptů init.d:
Z http://www.debian.org/doc/debian-policy/ch-opersys.html 9.3.2 --
Buďte opatrní při používání set -e ve skriptech init.d. Psaní správných skriptů init.d vyžaduje přijetí různých chybových ukončovacích stavů, když démoni již běží nebo jsou zastaveni bez přerušení skriptu init.d a běžné knihovny funkcí init.d není bezpečné volat s platnou sadou -e. U skriptů init.d je často snazší nepoužít set -e a místo toho zkontrolovat výsledek každého příkazu zvlášť.
Toto je platná otázka z hlediska tazatele, protože měří pracovní znalosti kandidátů v oblasti skriptování a automatizace na úrovni serveru
Řešení 2:
Od bash(1)
:
-e Exit immediately if a pipeline (which may consist of a
single simple command), a subshell command enclosed in
parentheses, or one of the commands executed as part of
a command list enclosed by braces (see SHELL GRAMMAR
above) exits with a non-zero status. The shell does not
exit if the command that fails is part of the command
list immediately following a while or until keyword,
part of the test following the if or elif reserved
words, part of any command executed in a && or ││ list
except the command following the final && or ││, any
command in a pipeline but the last, or if the command’s
return value is being inverted with !. A trap on ERR,
if set, is executed before the shell exits. This option
applies to the shell environment and each subshell envi-
ronment separately (see COMMAND EXECUTION ENVIRONMENT
above), and may cause subshells to exit before executing
all the commands in the subshell.
Bohužel nejsem dostatečně kreativní, abych přemýšlel, proč by to bylo nebezpečné, kromě toho, že „zbytek skriptu nebude proveden“ nebo „to by možná mohlo maskovat skutečné problémy“.
Řešení 3:
Je třeba poznamenat, že set -e
lze zapnout a vypnout pro různé části skriptu. Nemusí být zapnutý pro provedení celého skriptu. Mohlo by to být dokonce podmíněno povoleno. To znamená, že to nikdy nepoužívám, protože dělám své vlastní chyby (nebo ne).
some code
set -e # same as set -o errexit
more code # exit on non-zero status
set +e # same as set +o errexit
more code # no exit on non-zero status
Pozoruhodné je také toto ze sekce manuálové stránky Bash na trap
příkaz, který také popisuje, jak set -e
funguje za určitých okolností.
Depeše ERR se neprovede, pokud je neúspěšný příkaz součástí seznamu příkazů bezprostředně po chvíli nebo dokud klíčové slovo, součást testu v příkazu if, část příkazu provedeného v seznamu &&nebo ⎪⎪ nebo pokud je návratová hodnota příkazu je invertován přes !. Toto jsou stejné podmínky, jaké dodržuje možnost theerrexit.
Existují tedy určité podmínky, za kterých nenulový stav nezpůsobí ukončení.
Myslím, že nebezpečí je v nepochopení, kdy set -e
vstoupí do hry a když ne, a spoléhat se na to nesprávně za nějakého neplatného předpokladu.
Viz také BashFAQ/105 Proč nastavení -e (nebo nastavení -o errexit nebo past ERR) nedělá to, co jsem očekával?
Řešení 4:
Mějte na paměti, že se jedná o kvíz pro pracovní pohovor. Otázky možná napsali současní zaměstnanci a mohou se mýlit. To nemusí být nutně špatné a každý dělá chyby a otázky na pohovoru často leží v temném koutě bez kontroly a vyjdou až během pohovoru.
Je zcela možné, že 'set -e' nedělá nic, co bychom považovali za "nebezpečné". Ale autor této otázky se může mylně domnívat, že 'set -e' je nebezpečné kvůli jeho vlastní neznalosti nebo zaujatosti. Možná napsali zabugovaný skript shellu, ten strašlivě vybombardoval a mylně se domnívali, že za to může 'set -e', i když ve skutečnosti opomněli napsat správnou kontrolu chyb.
Za poslední 2 roky jsem se zúčastnil asi 40 pracovních pohovorů a tazatelé někdy kladou otázky, které jsou špatné, nebo mají špatné odpovědi.
Nebo je to možná triková otázka, která by byla chabá, ale ne zcela nečekaná.
Nebo možná toto je dobré vysvětlení:http://www.mail-archive.com/[email protected]/msg473314.html
Řešení 5:
set -e
říká bash ve skriptu, aby skončil, kdykoli něco vrátí nenulovou návratovou hodnotu.
Viděl jsem, jak by to bylo otravné a zabugované, nebyl jsem si jistý nebezpečným, pokud byste k něčemu neotevřeli oprávnění a než jste je mohli znovu omezit, váš skript zemřel.