2つの引数を取るプログラムが存在するとします。入力ファイルと出力ファイル。
この出力ファイルをディスクに保存したくないが、別のプログラムのstdin
に直接渡す場合はどうでしょうか。これを達成する方法はありますか?
Linuxで出くわす多くのコマンドには、出力ファイルの引数として「-」を渡すオプションがあります。これは、上記で指定したことを行います。これは、プログラムのstdin
を引数として渡すことができないためですか?もしそうなら、どうやってそれを行うのですか?
これを使用してイメージを作成する方法の例は次のとおりです。
pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" stdin(echo)
私が使用しているシェルはbashです。
プログラムがシークできない場合でもファイル記述子への書き込みをサポートしている場合は、/dev/stdout
を出力ファイルとして使用できます。これは私のシステムの/proc/self/fd/1
へのシンボリックリンクです。ファイル記述子1はstdoutです。
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 )
_
シェルがそれらをサポートしている場合、そのような操作を行う最も簡単な方法は プロセス置換 :<(…)
および>(…)
を使用することです。これは、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