Script de saída de erro de dentro da substituição de comando

3

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?

    
por Wildcard 21.01.2016 / 22:42

1 resposta

2

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"; }
}
    
por 21.01.2016 / 23:39