入力ファイルと出力ファイルという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
。