Если программа поддерживает запись в любой файловый дескриптор, даже если он не может искать, вы можете использовать / dev / stdout
в качестве выходного файла. Это символическая ссылка на / proc / self / fd / 1
в моей системе. Дескриптор файла 1 - стандартный вывод.
Из справочной страницы 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 )
Если ваша оболочка поддерживает их, простейшим способом выполнения таких манипуляций было бы использование подстановки процесса : <(…)
и > (…)
. Это работает в 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