Uma maneira comum é:
die() {
IFS=' ' # make sure "$*" is joined with spaces
# output the arguments if any on stderr:
[ "$#" -eq 0 ] || printf '%s\n' "$*" 1>&2
exit 1
}
então você o usa assim:
mkdir -p some/path || die "mkdir failed with status $?"
Ou, se você quiser incluir o status de saída, poderá alterá-lo para:
die() {
last_exit_status=$?
IFS=' '
printf '%s\n' "FATAL ERROR: $* (status $last_exit_status)" 1>&2
exit 1
}
e depois usá-lo é um pouco mais fácil:
mkdir -p some/path || die "mkdir failed"
Quando falha, mkdir
provavelmente já emitiu uma mensagem de erro, para que a segunda seja vista como redundante, e você pode simplesmente:
mkdir -p some/path || exit # with the same (failing) exit status as mkdir's
mkdir -p some/path || exit 1 # with exit status 1 always
(ou use a primeira variante die
acima sem argumento)
Caso você não tenha visto command1 || command2
antes, ele será executado command1
e, se command1
falhar, será executado command2
.
Então você pode ler como "criar o diretório ou morrer".
Seu exemplo seria semelhante a:
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
Ou você pode alinhar dies
mais à direita, para que o código principal seja mais óbvio.
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
Ou na linha a seguir, quando as linhas de comando forem longas:
mkdir -p some/path ||
die "mkdir failed"
cd some/path ||
die "cd failed"
some_command ||
die "some_command failed"
Além disso, se você usar o nome some/path
várias vezes, armazene-o em uma variável para não precisar digitá-lo e alterá-lo facilmente, se necessário. E ao passar argumentos variáveis para comandos, certifique-se de usar o --
delimitador de opções para que o argumento não seja considerado uma opção se começar com -
.
dir=some/path
mkdir -p -- "$dir" || die "Cannot make $dir"
cd -P -- "$dir" || die "Cannot cd to $dir"
some_command || die "Cannot run some_command"
return $?
-lo pelo:
interno.Se você realmente deseja
exit
um erro e está usando o Bash, também deve considerarset -e
. Dehelp set
:Obviamente, isso não oferece a flexibilidade de uma função did_it_work (), mas é uma maneira fácil de garantir que seu script bash pare com um erro sem adicionar muitas chamadas à sua nova função.
fonte
set -e
é útil. Existem alguns comandos que retornam diferente de zero em circunstâncias normais (por exemplo,diff
). Quando estou usando set -e em um script em que espero um retorno diferente de zero, eu façocommand || true
.set -e
, poderá definir um "manipulador de exceções" para detectar todos os errostrap did_it_work EXIT
.command && true
. Assim, o valor de retorno não é alterado.command || true
é impedir aset -e
saída do script secommand
retornar um código de saída diferente de zero. Altera o código de saída porque precisamos. A única coisa quecommand && true
faz é executartrue
(retornar um código de saída zero) se o comando `for bem-sucedido (retornou um código de saída zero) - é um no-op completo.