Это очень интересно. Я спросил парня, который хорошо знает bash, и он сказал мне так:
foo() { while IFS='' read -r line; do echo "$(date) $line" >> file.txt; done; };
Во-первых, это создает функцию, читающую одну строку необработанного ввода из stdin, в то время как присвоение IFS заставляет его не игнорировать пробелы. Прочитав одну строку, он выводит ее с соответствующими данными. Затем вы должны указать bash перенаправить stderr в эту функцию:
exec 2> >(foo)
Все, что вы пишете в stderr, теперь будет проходить через функцию foo. Обратите внимание, что когда вы делаете это в интерактивной оболочке, вы больше не увидите подсказку, потому что она печатается в stderr, а чтение в foo буферизуется строкой:)