Eu tenho um script que analisa nomes de arquivos em uma matriz usando o seguinte método obtido de uma sessão de perguntas e respostas no SO :
unset ARGS
ARGID="1"
while IFS= read -r -d $'\0' FILE; do
ARGS[ARGID++]="$FILE"
done < <(find "$@" -type f -name '*.txt' -print0)
Isso funciona muito bem e lida com todos os tipos de variações de nome de arquivo perfeitamente. Às vezes, no entanto, passarei um arquivo inexistente para o script, por exemplo:
$ findscript.sh existingfolder nonexistingfolder
find: `nonexistingfile': No such file or directory
...
Em circunstâncias normais, o script capturaria o código de saída com algo parecido RET=$?
e o usaria para decidir como proceder. Isso não parece funcionar com a substituição do processo acima.
Qual é o procedimento correto em casos como este? Como posso capturar o código de retorno? Existem outras maneiras mais adequadas de determinar se algo deu errado no processo substituído?
fonte
Use um co-processo . Usando o
coproc
builtin, você pode iniciar um subprocesso, ler sua saída e verificar seu status de saída:Se o diretório não existir,
wait
será encerrado com um código de status diferente de zero.Atualmente, é necessário copiar o PID para outra variável, pois
$LS_PID
será desabilitado antes dewait
ser chamado. Consulte Bash unsets * _PID variable antes que eu possa esperar no coproc para obter detalhes.fonte
read -u
deve funcionar tão bem. O exemplo deveria ser genérico e mostrar como a saída do coprocesso poderia ser canalizada para outro comando.Uma abordagem é:
A idéia é ecoar o status de saída junto com o token aleatório após a conclusão do comando e, em seguida, usar expressões regulares do bash para procurar e extrair o status de saída. O token é usado para criar uma sequência exclusiva para procurar na saída.
Provavelmente não é a melhor maneira de fazer isso no sentido geral de programação, mas pode ser a maneira menos dolorosa de lidar com isso no bash.
fonte