Estou trabalhando com um conjunto de scripts com funções tratadas como somente leitura. As funções são mais do que apenas uma lista de comandos, por exemplo, pode haver loops e alterar diretórios e até chamadas para outras funções:
func() {
cd folder/
run command1
mkdir folder2/ ; cd folder2/
run command2
}
Por um momento, fingindo que eu poderia mudar os scripts, para mostrar o que eu quero, pode ser assim:
func() {
cd folder/
string[0]="command1" ; run command1 |& tee out0.log ; result[0]="$?" ; finished_command_number 0
mkdir folder2/ ; cd folder2/
string[1]="command2" ; run command2 |& tee out1.log ; result[1]="$?" ; finished_command_number 1
}
Portanto, para comandos que podem ser canalizados, mas não for cd
ou loops, desejo armazenar uma string, armazenar o stdout (stderr), armazenar o código de saída e executar outro comando posteriormente. No entanto, não posso adicionar isso, deve ser feito no meu script que está invocando aquele com func().
Para obter apenas a funcionalidade de chamada de pós-comando, tentei copiar a função e executá-la do meu script com um trap foo debug
, mas isso não parece se propagar em funções. Não acho que copiar literalmente linha por linha funcionará porque o cd
e loops
não pode realmente ser isolado, pois são instruções de controle em vez de comandos de subshell.
Se as strings puderem ser apenas uma função dos próprios comandos, isso ainda será útil.
A saída pode ser filtrada pelas linhas marcadas com random. Eu deveria testar isso mais para ver como funciona com vários processos, mas parece funcionar muito bem com comandos de curta duração. Observe que o código de saída está atrasado em um comando, já que a depuração é aparentemente chamada primeiro.
===
Se estou lendo sua pergunta corretamente, você está procurando uma maneira de:
Isso pode ser feito de forma bastante simples:
A execução da função em um subshell permitirá que ela faça o que for necessário com relação à alteração do diretório de trabalho e à saída para stdout e stderr normalmente. Quando o subshell sai, o diretório de trabalho do script permanece inalterado e todas as saídas stdout e stderr são capturadas e redirecionadas para seus arquivos de log.
Adicionar uma matriz (global ou não) na qual capturar códigos de saída de comandos é trivial: