あるプログラムの標準入力を別のプログラムにパラメータとして渡すには?

あるプログラムの標準入力を別のプログラムにパラメータとして渡すには?

入力ファイルと出力ファイルという2つのパラメーターを使用するプログラムがあるとします。

この出力ファイルをディスクに保存せずに他のプログラムに直接渡すにはstdinどうすればよいですか?これを達成する方法はありますか?

Linux で遭遇した多くのコマンドは、上記で指定したタスクを実行する出力ファイル引数に「-」を渡すオプションを提供します。stdinプログラムをパラメータとして渡すことができないからですか?それでは、どうすればいいですか?

イメージングに使用する方法の例は次のとおりです。

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

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

答え1

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

答え2

pdftotextマニュアルページから:

テキストファイルが「-」の場合、テキストは標準出力に送信されます。

したがって、この場合必要なものは次のとおりです。

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が、ストリームは実際にはファイルではありませんが、インクルードプロセス(たとえばcat)の標準入力にパイプされます。したがって、ここでは最終的に必要に応じてテキストを出力する必要があります。

cat使用UUOCアラームベルが鳴ります。そのようなフォーラムで。ユーティリティがそれをサポートしていない場合、-これは役に立つ用途だと思いますcatが、このプロセスを使用せずに交換する方法がある場合は、catすべて耳を傾けるでしょう;-)。

ただし、(質問に示すように)ストリームの最終ターゲットが他のプログラムのSTDINである場合は、それをcat削除できます。

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

答え3

シェルがそれをサポートしている場合、このようなことを行う最も簡単な方法は次のようにすることです。プロセスの交換<(…)そして>(…)。これは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

cmd tty

tty接続されている端末の名前を返しますstdout

関連情報