web-dev-qa-db-ja.com

あるプログラムの標準入力を引数として別のプログラムに渡すにはどうすればよいですか?

2つの引数を取るプログラムが存在するとします。入力ファイルと出力ファイル。

この出力ファイルをディスクに保存したくないが、別のプログラムのstdinに直接渡す場合はどうでしょうか。これを達成する方法はありますか?

Linuxで出くわす多くのコマンドには、出力ファイルの引数として「-」を渡すオプションがあります。これは、上記で指定したことを行います。これは、プログラムのstdinを引数として渡すことができないためですか?もしそうなら、どうやってそれを行うのですか?

これを使用してイメージを作成する方法の例は次のとおりです。

pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" stdin(echo)

私が使用しているシェルはbashです。

17
Dziugas

プログラムがシークできない場合でもファイル記述子への書き込みをサポートしている場合は、/dev/stdoutを出力ファイルとして使用できます。これは私のシステムの/proc/self/fd/1へのシンボリックリンクです。ファイル記述子1はstdoutです。

13
TiCPU

pdftotext manページから:

Text-fileが´- 'の場合、テキストはstdoutに送信されます。

この場合、必要なのは次のとおりです。

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

または、これを別のプログラムのSTDINにパイプしたい場合:

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

ファイル名の代わりに_-_を使用することは、STDINからの入力またはSTDOUTへの出力が必要な場合に多くのユーティリティが従う規則(pdftotextを含む)です。ただし、すべてのユーティリティがこの規則に従うわけではありません。その場合、bashでこれを行う慣用的な方法は プロセス置換 を使用することです:

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

ここで、>( )は、_my_utility_に渡されるファイルとほぼ同じように動作しますが、ストリームは実際のファイルではなく、含まれるプロセスのstdin、つまりcatにパイプされます。したがって、ここでは、テキストは最終的に必要に応じて出力されます。

catを使用すると、ほとんどの場合、このようなフォーラムで OC警報ベル が発生します。ユーティリティが_-_をサポートしていない場合、これはcatの便利な使用法ですが、catなしでこのプロセス置換を行う方法がある場合は、ぜひ聞きたいです ;-)。

ただし、(質問のとおり)ストリームの最終的な宛先が別のプログラムのSTDINである場合は、catを削除できます。

_my_utility "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" >( another_prog )
_
11
Digital Trauma

シェルがそれらをサポートしている場合、そのような操作を行う最も簡単な方法は プロセス置換<(…)および>(…)を使用することです。これは、bash、zsh、ksh、およびおそらく他のシェルで動作します。例えば:

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

ただし、pdftotextはテキストファイルに保存されるため、この例では役に立ちません。 (-を使用する明らかなものを除いて)あなたの最良の選択は、@ TiCPUによって提案されているように/dev/stdoutを使用することですが、別のシェル機能を使用することもできます。コンストラクト!:Nは、前のコマンドのN番目の引数を参照します。したがって、次のことができます。

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