Existem várias maneiras de sair de um script.
VAR=$(FUNCTION) || kill -"$(($?&127))" 0
... pode ser um caminho. Ele deve passar para o grupo de processos do shell pai, qualquer que seja o retorno de FUNCTION
. Não é realmente desenvolvido, mas você pode facilmente obter o retorno de uma substituição de comando se é isso que você está pedindo. Senão, se você quiser sugestões sobre a atribuição de uma variável, bem, de dentro de uma função atual do shell, você pode fazer como:
fn(){ var=x; }; fn; echo "$var"
x
Se deve ser a saída de algum comando, então você está falando sobre avaliação em camadas. Você realmente precisa confiar nessa saída, ou então você precisa capturar o fluxo inteiro, e nesse caso é melhor ter certeza de quando esperar. Essas coisas geralmente são feitas com pipes - que é como funcionam as substituições de comandos - bem, isso e subcamadas, é claro. Assim como o shell, você precisa read
dos dados, como é sugerido em outro lugar.
Eu gosto de usar meu próprio pipe - eu escrevo um pouco de cada vez no buffer do pipe e o leio novamente quando estou pronto.
fn(){ echo hey; read hey; } <> <(:) >&0
fn; echo "$hey"
hey
... Eu acho que devo mencionar que, se você seguir este último exemplo, você deve tomar um cuidado especial não para preencher o buffer. Apenas escreva um pouco de cada vez e leia-o assim que puder. Em praticamente qualquer sistema, você pode contar com um buffer de base de 512 bytes - o que não é muito -, mas eles geralmente são maiores.
Se você não for cuidadoso, então, como o dono de ambas as extremidades daquele tubo, seu shell não receberá nenhum sinal frustrado de quit de qualquer outro processo quando ele travar, e ele ficará preso para sempre. Eu nunca aponto a saída de qualquer comando não-embutido em um desses descritores de arquivo, a menos que eu já tenha bifurcado um processo de leitura para drenar o tubo conforme necessário.
Seu material como aquele que torna o mesmo processo de mensagens difícil - você tem que gerenciá-lo meticulosamente, em perfeita sincronia, e rastrear todos os segmentos separados de uma tarefa simultaneamente. É por isso que os reservatórios são forjados.