Этого нельзя сделать без написания вспомогательной программы.
В общем случае stdin может быть дескриптором файла только для чтения (черт возьми, это может относиться только к файлу только для чтения ).Таким образом, вы не можете «вставить» что-либо в него.
Вам потребуется написать «вспомогательную» программу, которая контролирует два файловых дескриптора (скажем, 0 и 3), чтобы считывать их и «объединять» их.Было бы достаточно простого цикла select
или poll
, и вы могли бы написать его на большинстве языков сценариев, но не в оболочке, я не думаю.
Затем вы можете использовать перенаправление оболочки для подачивывод программы в дескриптор 3 «помощника».
Поскольку то, что вы хотите, в основном противоположно «tee», я могу назвать его «eet» ...
[edit]
Если бы вы только могли запустить "кот" в фоновом режиме ...
Но это не удастся, потому что фоновые процессы с управляющим терминалом не могут читать из стандартного ввода.Так что, если бы вы могли просто отсоединить "cat" от управляющего терминала и запустить его в фоновом режиме ...
В Linux "setsid cat" должен это сделать примерно.Но (а) я не мог заставить его работать очень хорошо, и (б) у меня действительно нет времени на это сегодня, и (в) это все равно нестандартно.
Я бы просто написал вспомогательную программу.
[edit 2]
ОК, похоже, это работает:
{ seq 5 ; sleep 2 ; seq 5 ; } | /bin/bash -c 'set -m ; setsid cat ; echo HELLO'
set -m
вещь заставляет bash
включить управление заданиями, что, по-видимому,необходим для предотвращения перенаправления командной строки в /dev/null.
Здесь echo HELLO
представляет вашу "программу A".Команды seq
(с sleep
в середине) предназначены только для ввода.И да, вы можете направить все это на обработку B.
Примерно такое уродливое и непереносимое решение, которое вы могли бы попросить ...