Как можно передать стандартный ввод одной программы в качестве аргумента другой?

Необходимо установить и установить KDM. Это - самый легкий путь.

17
20.07.2015, 19:13
4 ответа

Если программа поддерживает запись в любой файловый дескриптор, даже если он не может искать, вы можете использовать / dev / stdout в качестве выходного файла. Это символическая ссылка на / proc / self / fd / 1 в моей системе. Дескриптор файла 1 - стандартный вывод.

13
27.01.2020, 19:47

Из справочной страницы pdftotext :

Если текстовый файл - «- », текст отправляется на стандартный вывод.

Итак, в этом случае все, что вам нужно, это:

pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" -

Или, если вы хотите передать это по конвейеру в STDIN другой программы:

pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" - | another_prog

Использование - в качестве замены имени файла является соглашением, которому следуют многие утилиты (включая pdftotext), когда нам нужен ввод из STDIN или вывод в STDOUT. Однако не все утилиты следуют этому соглашению. В этом случае идиоматический способ сделать это в bash - использовать подстановку процесса :

my_utility "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" >( cat )

Здесь > () ведет себя в основном как файл, переданный в my_utility , но вместо того, чтобы быть реальным файлом, поток передается по конвейеру в stdin содержащегося процесса, то есть в cat. Итак, здесь текст в конечном итоге должен выводиться по мере необходимости.

Использование кота почти всегда вызывает сигнал тревоги UUOC на подобных форумах. Я утверждаю, что если утилита не поддерживает - , то это полезное использование cat , хотя, если есть какие-либо способы выполнить эту замену процесса без cat , то я весь уши ;-).

Однако, если (как указано в вопросе) конечным адресатом потока является STDIN другой программы, то cat можно исключить:

my_utility "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" >( another_prog )
11
27.01.2020, 19:47
cmd tty

tty возвращает имя терминала, подключенного к stdout .

-2
27.01.2020, 19:47

Если ваша оболочка поддерживает их, простейшим способом выполнения таких манипуляций было бы использование подстановки процесса : <(…) и > (…) . Это работает в bash, zsh и ksh и, возможно, в других оболочках. Например:

$ sort <(printf "b\nc\na\n")
a
b
c
$ ls
foo
$ cp <(find . -name foo) bar
$ ls
bar  foo

Однако это не поможет в приведенном вами примере, поскольку pdftotext будет сохранен в текстовом файле. Хотя ваш лучший выбор (помимо очевидного использования - ) - использовать / dev / stdout , как предлагает @TiCPU, вы также можете использовать другую функцию оболочки. Конструкция !: N относится к N-му аргументу предыдущей команды. Следовательно, вы можете сделать:

$ pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf"  out.txt
$ cat !:2
4
27.01.2020, 19:47

Теги

Похожие вопросы