Самый простой способ сделать это в обычном bash - это использовать подстановка процесса вместо конвейера. Есть несколько отличий, но они, вероятно, не имеют большого значения для вашего варианта использования:
- При запуске конвейера bash ожидает завершения всех процессов.
- Отправка Ctrl-C в bash заставляет его убивать все процессы конвейера, а не только основной.
- Опция
pipefail
и переменная PIPESTATUS
не имеют отношения к процессу замещения.
- Возможно, больше
С заменой процесса bash просто запускает процесс и забывает об этом, он даже не виден в jobs
.
Упомянутые различия, кроме consumer < <(producer)
и producer | consumer
, по существу эквивалентны.
Если вы хотите переключить, какой из них является «основным» процессом, вы просто переключаете команды и направление замены на producer > >(consumer)
. В вашем случае:
command > >(tee out.txt)
Пример: * * тысяча двадцать-восемь
$ { echo "hello world"; false; } > >(tee out.txt)
hello world
$ echo $?
1
$ cat out.txt
hello world
$ echo "hello world" > >(tee out.txt)
hello world
$ echo $?
0
$ cat out.txt
hello world
Как я уже сказал, есть отличия от выражения канала. Процесс может никогда не остановиться, если он не чувствителен к закрытию трубы. В частности, он может продолжать записывать данные в ваш стандартный вывод, что может сбивать с толку.