Как использовать вывод команды в качестве ввода для другой программы в Linux?

У меня есть программа, работающая на linux

Эта программа принимает входные данные со стандартного ввода

Итак, я могу запустить его с входным файлом таким образом

myprogram < file

чтобы не вводить ввод в программу

Теперь я хочу, чтобы программа принимала входные данные из вывода команды. что-то подобное

myprogram < anycommand

но это не работает, потому что ожидает файл, а не команду.

Как я могу заставить это работать? Есть ли синтаксис оболочки, чтобы заставить его работать?

Примечание: я не могу использовать канал типа anycommand | myprogram


person MOHAMED    schedule 29.04.2014    source источник
comment
Лучше всего объяснить, почему вы не можете использовать anycmd| myprog? Это основной шаблон всех Unix-подобных программ. Удачи.   -  person shellter    schedule 29.04.2014


Ответы (3)


обычно (ИМХО) myprogram ничего не знает о файле. Bash запускает myprogram, читает файл и записывает содержимое file в stdin myprogram. Итак, myprogram не должен знать, что его стандартный ввод - это файл. Итак, anycommand | myprogram должен работать.

Если это не работает с пеплом, возможно, вы можете создать именованный канал (mkfifo / tmp / testpipe). Теперь вы можете запустить свою программу с myprogram < /tmp/testpipe и записать свой ввод в / tmp / testpipe

person Biber    schedule 29.04.2014

Использовать его нужно так:

myprogram < <(anycommand)

Это называется подстановкой процесса.

person anubhava    schedule 29.04.2014
comment
Спасибо за ответ. Я пробовал вашу команду, но она возвращает следующую ошибку: -ash: syntax error: unexpected redirection - person MOHAMED; 29.04.2014
comment
Я не уверен, поддерживает ли ash это, вы можете использовать bash? - person anubhava; 29.04.2014
comment
У меня нет возможности проверить это в ash, так как у меня его нет. Есть ли для этого онлайн-тестер? - person anubhava; 29.04.2014
comment
Я просмотрел linux.about.com/library/cmd/blcmdl1_ash.htm и не нашел замены процесса. Вы пробовали: anycommand|myprogram? Какая у вас ошибка? - person anubhava; 29.04.2014

В моей системе Linux ash - это символическая ссылка на dash, которая отлично обрабатывает каналы:

pax> ls -ld $(which ash)
lrwxrwxrwx 1 root root 4 Mar  1  2012 /bin/ash -> dash

pax> ash

$ echo hello | tr '[a-z]' '[A-Z]'
HELLO

Так что я бы дал anycommand | myprogram еще один выстрел на всякий случай.

Если у вашего ash нет возможности конвейера, вы всегда можете вернуться к использованию временных файлов, при условии, что anycommand не является долгоживущим процессом, вывод которого вам нужно обрабатывать поэтапно:

anycommand >/tmp/tempfile
myprogram </tmp/tempfile
person paxdiablo    schedule 29.04.2014