Имея следующий bash-скрипт:
#!/bin/bash
set -e
function foo() {
# commands that might fails and I want to exit my script
...
echo "result I need as output"
}
my_var=$(foo)
echo "I don't want this if there is an error inside foo"
Использование set -e
(в bash 4.4.19
), похоже, не работает с подоболочками, т.е. последняя команда echo
все еще выполняется). Как я могу написать код для выхода из скрипта, если какая-либо из команд внутри foo
завершается с ненулевым кодом выхода.
Я использую bash GNU bash, version 4.4.19(1)-release (x86_64-apple-darwin16.7.0)
, и результат вызова моего скрипта (где точки заменены недопустимой командой head -this
:
$ ./my_script
head: illegal option -- t
usage: head [-n lines | -c bytes] [file ...]
I don't want this if there is an error inside foo
head
; либоhead .. || exit 1
, либо включение опции-e
внутри подоболочкиmy_var=$(set -e; foo)
, первый вариант лучше, потому что ясен и его легче понять другим - person Nahuel Fouilleul   schedule 28.05.2018head
на самом деле является командойgrep ... | head ... | awk ... | xargs ...
, как вы можете переписать эти пайпы? Используете(grep ... || exit 1) | (head ... || exit 1) | ...
? - person Gabriel Petrovay   schedule 28.05.2018set -o pipefail
, обратите внимание, чтоpipefail
не очищается в подоболочке - person Nahuel Fouilleul   schedule 28.05.2018