Насколько я знаю, я могу использовать команду tee, чтобы разделить стандартный вывод на экран и другие файлы:
command -option1 -option2 argument | tee file1 file2 file3
Можно ли перенаправить вывод в команды вместо файлов, используя tee, чтобы я теоретически мог создать цепочку команд?
command-line
pipe
tee
Абдул Аль Хазред
источник
источник
Ответы:
Вы можете использовать именованные каналы ( http://linux.die.net/man/1/mkfifo ) в командной строке
tee
и иметь команды, читающие на именованных каналах.Когда
command
закончится,tee
закроет именованные каналы, которые будут сигнализировать EOF (чтение 0 байтов) на каждом из/tmp/dataN
которых обычно завершитcmdN
процессы. Реальный пример:Из-за фоновых процессов оболочка вернула приглашение перед выходом программы. Все три экземпляра
wc
прекращаются нормально.источник
/tmp/data/{0,1,2}
. Опять же, в bash вы можете использовать процесс подстановки иmkfifo
полностью пропуститьЕсли я правильно понимаю, вы ищете эквивалент
tee file1 file2 file3
, но вместо того, чтобы записывать одни и те же данные в три файлаfile1
,file2
иfile3
вы хотите разделить одни и те же данные на три командыcmd1
,cmd2
иcmd3
, т.е.должно быть эквивалентно
за исключением того,
…
что будет выполнено только один раз.Есть два способа сделать это.
Ksh93, bash и zsh поддерживают процесс подстановки . Это обобщение каналов, которое позволяет аргументу команды быть файлом, который при записи в него передает данные в качестве входных данных для команды (также существует вариант ввода, который при чтении из него получает данные, выводимые командой) , То есть,
печатает
hello
на стандартный вывод и дополнительно работаетcmd1
сhello
вводом.Так, например, если вы хотите дублировать ввод
somecommand
и передать его обоимcmd1
иcmd2
, вы можете использоватьЕсли ваша оболочка не поддерживает подстановку процессов, вы можете использовать именованные каналы. Посмотрите ответ Арсеге о том, как это работает. Именованные каналы менее удобны, чем подстановка процессов, потому что их нужно создавать и удалять, а также запускать и синхронизировать процессы вручную. Их преимущество в том, что они полностью переносимы, в то время как не все оболочки поддерживают процессные замены. Они также могут использоваться в сценариях, отличных от тех, для которых предназначена замена процесса.
Под капотом в некоторых системах для подстановки процессов используются именованные каналы. Однако в большинстве систем он использует именованные файлы, представляющие файловые дескрипторы .
источник
pee
изmoreutils
.По крайней мере, в bash вы можете пропустить,
mkfifo
используя подстановку процесса:или принять пример Арцежа
источник
Я удивлен, что никто не упомянул
pee
команду из moreutils ( https://joeyh.name/code/moreutils ).источник