(Возможно, связано с Некоторые программы не принимают замену процессов для входных файлов?)
В некоторых сценариях Bash unit test я использую следующий трюк для регистрации и отображения 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 run это не удалось 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. Спасибо за ответы!