Se você chamar o script source, poderá usar return <x>where<x> estará o status de saída do script (use um valor diferente de zero para erro ou falso). Mas se você chamar um script executável (ou seja, diretamente com seu nome de arquivo), a declaração de retorno resultará em uma reclamação (mensagem de erro "return: pode apenas 'retornar' de uma função ou script de origem").
Se exit <x>for usado, quando o script for chamado source, resultará na saída do shell que iniciou o script, mas um script executável será encerrado, conforme o esperado.
Para lidar com ambos os casos no mesmo script, você pode usar
return <x> 2> /dev/null || exit <x>
Isso manipulará qualquer chamada que seja adequada. Isso pressupõe que você usará essa declaração no nível superior do script. Eu desaconselharia a saída direta do script de dentro de uma função.
Nota: <x>é suposto ser apenas um número.
1consistente. Se o script for executado por outro script, convém definir seu próprio conjunto de códigos de status com um significado específico. Por exemplo,1== testes falharam,2== falha na compilação. Se o script fizer parte de outra coisa, pode ser necessário ajustar os códigos para corresponder às práticas usadas lá. Por exemplo, quando parte do conjunto de testes é executada pela automake, o código77é usado para marcar um teste como ignorado.