Обманчивость программы командной строки Unix для приема файлового потока - PullRequest
2 голосов
/ 09 марта 2010

Гипотетическая ситуация. У меня есть программа командной строки в * nix (Linux, BSD и т. Д.). Он был написан так, что вы передаете ему текстовый файл в качестве аргумента

$ program file.txt

Запустите программу, она смотрит на текст в file.txt.

Можно ли "обмануть" эту программу, чтобы она принимала входные данные из файлового потока, а не считывала файл с диска? Мне довольно удобно использовать каналы Unix для do вещей, но в их внутренних элементах есть что-то немного загадочное, из-за чего я не могу сказать (окончательно) да или нет на поставленный выше вопрос.

Ответы [ 4 ]

4 голосов
/ 09 марта 2010

bash позволяет вам сделать это:

program <(otherprogram)

Используется вывод otherprogram в качестве содержимого файла, переданного program.

3 голосов
/ 09 марта 2010

Вас могут заинтересовать именованные трубы :

mkfifo myPipe
program myPipe &
anotherProgram > myPipe

эквивалентно:

anotherProgram | program
1 голос
/ 09 марта 2010

, если ваш program не закодирован для приема стандартного ввода, он не будет работать, даже если вы используете именованные каналы или подстановку процесса

0 голосов
/ 04 декабря 2010

В дополнение к управляемой оболочкой хитрости других ответов:

В некоторых системах Unix есть специальные файлы /dev/stdin, и вы можете запустить, например,

otherprogram | program /dev/stdin

Другие (например, linux) могут иметь /proc/self/fd/0, который можно использовать таким же образом.

Оба из них завершатся с ошибкой, если stdin будет закрыт перед открытием файла в командной строке, но это будет крайне редким явлением. Гораздо более вероятно, что он потерпит неудачу, потому что программа ожидает seek() файл, который не работает на каналах.

Если ваша оболочка zsh, у вас есть другая опция.

program =(otherprogram)

Что сделает все возможное для настройки временного входного файла и удаления его после завершения program. Это будет работать с seek(), но может временно занять больше места.

...