Допустим, существует программа, которая принимает два аргумента; входной файл и выходной файл.
Что делать, если я не хочу сохранять этот выходной файл на диск, а просто передать его stdin
другой программе. Есть ли способ добиться этого?
Многие команды, с которыми я сталкиваюсь в Linux, предоставляют опцию для передачи «-» в качестве аргумента выходного файла, что делает то, что я указал выше. Это потому, что передача stdin
программы в качестве аргумента невозможна? Если это так, как мы это делаем?
Пример того, как я мог бы использовать это изображение:
pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" stdin(echo)
Я использую оболочку bash.
bash
io-redirection
arguments
DZIUGAS
источник
источник
cat <file | cmd /dev/fd/0
работает на большинстве офисов.cat < README.txt | cp /dev/fd/0
.cp: missing destination file operand after ‘/dev/fd/0’ Try 'cp --help' for more information.
program input-file /dev/stdout | another-program
? Также обратите внимание, чтоecho
ничего не читает из стандартного ввода.cp
файл нигде.echo 1 2 3| cp /dev/fd/0 /dev/tty
напечатает1 2 3
. И, кстати, с/dev/fd/[num]
большей вероятностью сработает, чем/dev/std(in|out|err)
в большинстве случаев. См. Портативность ссылок файлов-дескрипторов о том, что и где вы можете ожидать.Ответы:
Если программа поддерживает запись в любой файловый дескриптор, даже если она не может искать, вы можете использовать
/dev/stdout
в качестве выходного файла. Это символическая ссылка/proc/self/fd/1
на мою систему. Файловым дескриптором 1 является стандартный вывод.источник
pdftotext
как и многие (но не все), другие утилиты также поддерживают-
это (что будет работать даже в системах, которые не поддерживают / dev / stdout, или где / dev / stdout не работает, как ожидалось, как в Linux, где stdout не поддерживается). трубка).pdftotext file.pdf - | wc -c
Со
pdftotext
страницы руководства :Так что в этом случае все, что вам нужно, это:
Или, если вы хотите передать это в STDIN другой программы:
Использование в
-
качестве замены имени файла является соглашением, которому следуют многие утилиты (включая pdftotext), когда мы хотим вводить из STDIN или выводить в STDOUT. Однако не все утилиты следуют этому соглашению. В этом случае идиоматическим способом сделать это в bash является использование подстановки процесса :Здесь
>( )
поведение в значительной степени похоже на файл, переданныйmy_utility
, но вместо того, чтобы быть реальным файлом, поток передается в стандартный поток содержимого процесса, то есть cat. Так что здесь, текст должен в конечном итоге выводиться по мере необходимости.Использование
cat
почти всегда вызывает тревогу UUOC на подобных форумах. Я утверждаю, что если утилита не поддерживает-
, тогда это полезное использованиеcat
, хотя, если есть какие-либо способы сделать эту замену процесса безcat
, тогда я весь слух ;-).Однако, если (как говорится в вопросе) конечным пунктом назначения потока является STDIN другой программы, то это
cat
можно исключить:источник
prog2
запись в stdout, лучше, чем , потому что форма ожидает завершения (т. Е. До того, как оболочка выдаст следующее приглашение или перейдет к следующей команде (например, после или )), в то время как Без формы форма ожидает только завершения. Кроме того, после формы отображается статус выхода из , тогда как в другой - статус выхода из . (Вы платите деньги и выбираете.)prog1 input_file
>( cat ) |
prog2
prog1 input_file
>(
prog2
)
cat
prog2
;
&&
cat
prog1
cat
$?
prog2
$?
prog1
Если ваша оболочка поддерживает их, самым простым способом выполнения таких манипуляций будет использование подстановки процесса :
<(…)
и>(…)
. Это работает в bash, zsh и ksh и, возможно, в других оболочках. Например:Тем не менее, это не поможет в приведенном вами примере, так
pdftotext
как сохранит в текстовом файле. Хотя ваш лучший выбор (кроме очевидного использования-
) - это использование,/dev/stdout
предложенное @TiCPU, вы также можете использовать другую функцию оболочки. Конструкция!:N
ссылается на N-й аргумент предыдущей команды. Следовательно, вы можете сделать:источник
cat <()
может быть полезно в некоторых ситуациях, в этом случае, однако, это не работает вообще. Проблема (очень плохо описанная OP, я должен признать) заключается в том, что онаpdftotext
принимает два аргумента: входной файл и выходной файл . Если второй аргумент отсутствует, то он ничего не производит, поэтомуcat <(pdftotext "file.pdf")
также ничего не возвращает. Команду можно обманутьpdftotext
, приведя>(cat)
в качестве второго аргумента, как ответил Digital Trauma, ноcat <()
здесь это бессмысленно. Очевидно, вpdftotext
случае, если это лучше всего использовать в-
качестве имени выходного файла.>( )
будет эффективно направлять поток к тому процессу, который находится внутри, поэтому нам действительно нуженcat
здесь для вывода этого потока. Обычно мы должны иметь возможность сделать что-то подобноеpdftotext input.pdf -
, но, очевидноpdftotext
, не поддерживает-
параметр для вывода непосредственно в стандартный вывод вместо файла - попробуйте это.>(grep something)
чтобы быть более полезной. Кстати, мояpdftotext 3.04
делать поддержка в-
качестве выходного файла, так что я немного удивлен всей дискуссии.pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf"
, который помещает вывод в вызываемый файлC BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.txt
, но ни один из текста не выводится в STDOUT для передачи в другую программу.tty
возвращает имя подключенного терминалаstdout
.источник
tty
имя терминала, а затем использовать этот файл, например, в качестве выводаpdftotext file.pdf /dev/pts/2
. В таком случае я согласен.prog1 input_file
$(tty)
prog1 input_file
/dev/tty
prog1