У меня есть скрипт, который анализирует имена файлов в массив, используя следующий метод, взятый из Q & A на SO :
unset ARGS
ARGID="1"
while IFS= read -r -d $'\0' FILE; do
ARGS[ARGID++]="$FILE"
done < <(find "$@" -type f -name '*.txt' -print0)
Это прекрасно работает и прекрасно обрабатывает все типы вариаций имени файла. Однако иногда я передаю несуществующий файл в скрипт, например:
$ findscript.sh existingfolder nonexistingfolder
find: `nonexistingfile': No such file or directory
...
При нормальных обстоятельствах я хотел бы, чтобы скрипт захватывал код завершения с чем-то вроде RET=$?
и использовал его, чтобы решить, как действовать дальше. Это, похоже, не работает с процессом замены выше.
Какова правильная процедура в подобных случаях? Как я могу получить код возврата? Есть ли другие более подходящие способы определить, что-то пошло не так в замененном процессе?
источник
Используйте сопроцесс . Используя
coproc
встроенную функцию, вы можете запустить подпроцесс, прочитать его вывод и проверить его состояние выхода:Если каталог не существует,
wait
выйдет с ненулевым кодом состояния.В настоящее время необходимо скопировать PID в другую переменную, поскольку
$LS_PID
он будет сброшен до вызоваwait
. Посмотрите переменную Bash unsets * _PID, прежде чем я смогу ждать на coproc для деталей.источник
read -u
должно работать так же хорошо. Этот пример должен был быть универсальным и показывать, как вывод сопроцесса может быть передан в другую команду.Один из подходов:
Идея состоит в том, чтобы отобразить состояние выхода вместе со случайным токеном после завершения команды, а затем использовать регулярные выражения bash для поиска и извлечения статуса выхода. Маркер используется для создания уникальной строки для поиска в выходных данных.
Вероятно, это не лучший способ сделать это в общем смысле программирования, но это может быть наименее болезненный способ справиться с этим в bash.
источник