У меня есть программа, которая читает из двух входных файлов одновременно. Я бы хотел, чтобы эта программа читалась со стандартного ввода. Я думал, что буду использовать что-то вроде этого:
$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
на уровне syscall. Это интересно. Является ли bash
не подключением stdin к подоболочке?: (
Есть ли решение? Мне нужно использовать подстановку процессов (формат ... <(...)
), потому что $program1
(tail
, кстати) ожидает файлы, и мне нужно выполнить некоторую предварительную обработку (с od
) на стандартном входе, прежде чем я смогу передать ее tail
- Я не могу просто указать /dev/stdin
и др.
EDIT:
То, что я на самом деле хочу сделать, - это прочитать из файла (который будет писать другой процесс), а также читать со стандартного ввода, чтобы я мог принимать команды и т.д. Я надеялся, что смогу сделать
tail -f <(od -An -vtd1 -w1) <(cat fifo)
для чтения со стандартного ввода и FIFO одновременно и отбросить его в один поток stdout, который я мог бы выполнить через awk (или аналогичный). Я знаю, что я мог бы решить это тривиально на любом языке сценариев, но мне нравится учиться делать bash
все: P
EDIT 2: я спросил новый вопрос, который более подробно объясняет контекст, описанный выше.