Tengo un script que analiza los nombres de archivo en una matriz utilizando el siguiente método tomado de un Q&A en SO :
unset ARGS
ARGID="1"
while IFS= read -r -d $'\0' FILE; do
ARGS[ARGID++]="$FILE"
done < <(find "$@" -type f -name '*.txt' -print0)
Esto funciona muy bien y maneja perfectamente todo tipo de variaciones de nombre de archivo. A veces, sin embargo, pasaré un archivo no existente al script, por ejemplo:
$ findscript.sh existingfolder nonexistingfolder
find: `nonexistingfile': No such file or directory
...
En circunstancias normales, el script capturaría el código de salida con algo parecido RET=$?
y lo usaría para decidir cómo proceder. Esto no parece funcionar con la sustitución del proceso anterior.
¿Cuál es el procedimiento correcto en casos como este? ¿Cómo puedo capturar el código de retorno? ¿Hay otras formas más adecuadas de determinar si algo salió mal en el proceso sustituido?
fuente
Usa un coproceso . Usando el
coproc
builtin puede iniciar un subproceso, leer su salida y verificar su estado de salida:Si el directorio no existe,
wait
saldrá con un código de estado distinto de cero.Actualmente es necesario copiar el PID a otra variable porque
$LS_PID
se desarmará antes de quewait
se llame. Ver Bash desarma * _PID variable antes de que pueda esperar en coproc para más detalles.fuente
read -u
debería funcionar igual de bien. El ejemplo debía ser genérico y mostrar cómo la salida del coproceso podría canalizarse a otro comando.Un enfoque es:
La idea es hacer eco del estado de salida junto con el token aleatorio después de que se haya completado el comando, y luego usar expresiones regulares bash para buscar y extraer el estado de salida. El token se usa para crear una cadena única para buscar en la salida.
Probablemente no sea la mejor manera de hacerlo en un sentido general de programación, pero podría ser la forma menos dolorosa de manejarlo en bash.
fuente