GNU/Linux >> Znalost Linux >  >> Linux

Co dělá 'set -e' a proč by mohlo být považováno za nebezpečné?

Ř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.


Linux
  1. Co je to linuxový server a proč jej vaše firma potřebuje?

  2. Co je příkaz Chown v Linuxu a jak jej používat

  3. Co je příkaz cURL a jak jej používat?

  1. Co je webový server a jak webový server funguje?

  2. Co je TAM a proč byste jím mohli chtít být?

  3. Co je to `S_ISREG()` a co dělá?

  1. Co je Makefile a jak funguje?

  2. Co je to Matrox GPU a proč ho má UNIX server mé univerzity?

  3. Co je to pošta a jak se v ní orientuje?