Если я правильно понимаю, вы ищете эквивалент tee file1 file2 file3
, но вместо того, чтобы записывать одни и те же данные в три файла file1
, file2
и file3
вы хотите разделить одни и те же данные на три команды cmd1
, cmd2
и cmd3
, т.е.
… | ??? cmd1 cmd2 cmd3
должно быть эквивалентно
… | cmd1 &
… | cmd2 &
… | cmd3 &
за исключением того, …
что будет выполнено только один раз.
Есть два способа сделать это.
Ksh93, bash и zsh поддерживают процесс подстановки . Это обобщение каналов, которое позволяет аргументу команды быть файлом, который при записи в него передает данные в качестве входных данных для команды (также существует вариант ввода, который при чтении из него получает данные, выводимые командой) , То есть,
echo hello | tee >(cmd1)
печатает hello
на стандартный вывод и дополнительно работает cmd1
с hello
вводом.
Так, например, если вы хотите дублировать ввод somecommand
и передать его обоим cmd1
и cmd2
, вы можете использовать
somecommand | tee >(cmd1) | cmd2
Если ваша оболочка не поддерживает подстановку процессов, вы можете использовать именованные каналы. Посмотрите ответ Арсеге о том, как это работает. Именованные каналы менее удобны, чем подстановка процессов, потому что их нужно создавать и удалять, а также запускать и синхронизировать процессы вручную. Их преимущество в том, что они полностью переносимы, в то время как не все оболочки поддерживают процессные замены. Они также могут использоваться в сценариях, отличных от тех, для которых предназначена замена процесса.
Под капотом в некоторых системах для подстановки процессов используются именованные каналы. Однако в большинстве систем он использует именованные файлы, представляющие файловые дескрипторы .