Você precisa enviar um sinal para o shell principal:
# start of the main script:
MAIN_SHELL_PID=$$
[...]
myfunction() {
... || { echo "error" >&2 ; kill -HUP "$MAIN_SHELL_PID"; }
}
Se eu tiver uma função:
myfunction() {
[ -d somedirectory ] && [ "some other condition" ] || { echo "error" >&2 ; exit 1; }
global_var=somevalue
}
E eu chamo de outra função:
some_other_function() {
myfunction
# Do something with "$global_var"
}
Isso funciona como esperado: Se as condições em myfunction
falharem, a saída de erro mata o script inteiro para impedir que códigos adicionais sejam executados.
Ao refatorar um script muito grande que compartilha definições de funções com outros scripts (em um arquivo originado), eu quero me livrar de algumas das variáveis globais retornando-as assim:
myfunction() {
[ -d somedirectory ] && [ "some other condition" ] || { echo "error" >&2 ; exit 1; }
local somevar=somevalue
# do stuff with "$somevar", then...
# return value of somevar to calling function.
printf %s "$somevar"
}
some_other_function() {
local anothervar="$(myfunction)"
# Do something with "$another_var"
}
No entanto, a saída de erro aqui não funciona conforme o esperado. Em vez de matar o script, ele apenas mata essa função, que é executada em um subshell por causa da substituição do comando.
Existe uma maneira de modularizar esse grande script para permitir que os valores de texto sejam retornados de funções (em vez de usar variáveis globais) e ainda permitir que as funções de erro saiam do script inteiro?
Você precisa enviar um sinal para o shell principal:
# start of the main script:
MAIN_SHELL_PID=$$
[...]
myfunction() {
... || { echo "error" >&2 ; kill -HUP "$MAIN_SHELL_PID"; }
}