(возможно, связано с Некоторые программы не допускают подстановку процессов для входных файлов? )
В некоторых скриптах модульного тестирования Bash я использую следующий трюк для регистрации и отображения stdout и stderr команды:
command > >(tee "${stdoutF}") 2> >(tee "${stderrF}" >&2)
Этот процесс производит вывод в stdout, поэтому файл $stdoutF
получает некоторые данные. Затем я запускаю другую команду, которая не выводит никаких данных:
diff -r "$source" "$target" > >(tee "${stdoutF}") 2> >(tee "${stderrF}" >&2)
Однако не похоже, что этот процесс всегда успешно завершается до запуска теста на пустоту (с помощью shunit-ng ):
assertNull 'Unexpected output to stdout' "$(<"$stdoutF")"
В тесте с 100 прогонами это не удавалось 25 раз.
Достаточно ли позвонить sync
перед проверкой файла на пустоту:
sync
assertNull 'Unexpected output to stdout' "$(<"$stdoutF")"
... и / или должен ли он работать, форсируя последовательность команд:
diff -r "$source" "$target" \
> >(tee "${stdoutF}"; assertNull 'Unexpected output to stdout' "$(<"$stdoutF")")
2> >(tee "${stderrF}" >&2)
... и / или возможно ли tee
это как-то assertNull
напрямую вместо файла?
Обновление : sync
не ответ - см. Ответ Жиля ниже.
Обновление 2 : обсуждение продолжено до Сохранение stdout, stderr и stdout + stderr синхронно . Спасибо за ответы!