set -eo pipefail se liší na ksh a bash

Chtěl bych ukončit skript při jakémkoli selhání, včetně uvnitř potrubí. V bash můžete set -eo pipefail, ale v ksh to nefunguje.

Příklad:

# x set -eo pipefail false | true echo "done: $?" # reached in ksh, unexpected false echo "done2" # not reached in either shell, as expected 
bash x # prints nothing, as expected ksh x # done: 1 ksh --version # ... 93u+ 2012-08-01 

Proč by v tomto případě ksh neopustil?

Upravit: Přidání dalšího testu

Porovnal jsem to s jinými skořápky a dostávám různé výsledky:

-bash-5.0$ zsh -c "set -eo pipefail; false | true; exit 2" ; echo $? 1 -bash-5.0$ ksh -c "set -eo pipefail; false | true; exit 2"; echo $? 2 -bash-5.0$ bash -c "set -eo pipefail; false | true; exit 2" ; echo $? 1 

Kromě chyby v ksh nerozumím, co by mohlo toto chování způsobit. Podle člověka ksh:

-e Unless contained in a ⎪⎪ or && command, or the command following an if while or until command or in the pipeline following !, if a command has a non-zero exit # Pipeline does not follow ! status, execute the ERR trap, if set, and exit. This # Pipeline has a non-zero exit status mode is disabled while reading profiles. pipefail A pipeline will not complete until all components of the pipeline have completed, and the return value will be the value of the last non-zero command to fail or zero if no command has failed. 

Komentáře

  • Můžete použít pochybnou verzi ksh93. Funguje podle očekávání u ksh93 t + od roku 2010 od OpenSolaris a BTW: toto je nejrychlejší ksh93, jaký byl kdy viděn.
  • OpenBSD ksh93 u + vytiskne hotovou zprávu, fwiw.
  • @Shawn, což není překvapující, protože ' s stejnou verzi jako OP ' s 😉
  • Právě jsem zkusil i linux. Verze ... 2020.0.0 má stejné chování. Dotaz aktualizuji jiným te st

Odpověď

Vypadá to jako regrese zavedená ksh93u +. ksh93u pracoval v tomto ohledu podle očekávání (a jako zsh, bash, mksh, yash a busybox sh).

Právě jsem nastolil problém na https://github.com/ksh93/ksh/issues/121

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *