У меня есть программа, которая одновременно читает два входных файла. Я хотел бы, чтобы эта программа читалась со стандартного ввода. Я думал, что буду использовать что-то вроде этого:
$program1 <(cat) <($program2)
но я только что обнаружил, что
cat <(cat)
производит
....
mmap2(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb758e000
read(0, 0xb758f000, 131072) = -1 EIO (Input/output error)
....
cat: -: Input/output error
и аналогично,
$ cat <(read -n 1)
bash: read: read error: 0: Input/output error
Итак... Linux не справляется с read
на уровне системных вызовов. Это интересно. Разве bash
не подключает стандартный ввод к подоболочке? :(
Есть ли этому решение? Мне особенно нужно использовать подстановку процесса (формат ... <(...)
), потому что $program1
(кстати, tail
) ожидает файлы, и мне нужно выполнить некоторую предварительную обработку (с od
) на стандартном вводе, прежде чем я смогу передать его tail
- я не могу просто указать /dev/stdin
и др.
РЕДАКТИРОВАТЬ:
Что я на самом деле хочу сделать, так это прочитать из файла (в который будет писать другой процесс), в то время как я также читаю из стандартного ввода, чтобы я мог принимать команды и тому подобное. Я надеялся, что смогу сделать
tail -f <(od -An -vtd1 -w1) <(cat fifo)
чтобы одновременно читать из стандартного ввода и FIFO и поместить его в один поток stdout, который я мог бы запустить через awk (или аналогичный). Я знаю, что мог бы решить это тривиально на любом языке сценариев, но мне нравится учиться тому, как заставить bash
делать все :P
EDIT 2: я спросил новый вопрос, который более полно объясняет контекст, описанный выше.
tail
stdin
. Надеюсь, мой ответ может дать вам некоторую подсказку. - person pynexj   schedule 17.03.2017ssh user@host
на своем OSX, как я упоминал в своем другом ответе? - person pynexj   schedule 18.03.2017