パイプラインのプログラムで標準入力をオプションとして参照するにはどうすればよいですか?


0

次のプログラムの標準入力として使用したいファイルを出力するプログラムがあります。ただし、program2には、ファイル名を必要とする「-in」および「-out」オプションがあります。だから私がprogram2にパイプしている場合、「-in」オプションのstdinをどのように参照できますか?

program1 | program2 -in stdin -out filename

回答:


3

場合はprogram2、それ自体によって、その標準入力を使用していない-in入力ファイルを指定する唯一の方法である、これらは便利なオプションです。

  • /proc/self/fd/0または/proc/fd/0(利用可能な場合、カーネル機能、POSIXには不要)

    program1 | program2 -in /proc/self/fd/0 -out filename
  • プロセス置換(Bashおよび他のいくつかのシェルでサポートされていますが、POSIXでは必要ありません)

    program2 -in <(program1) -out filename
  • fifoという名前(POSIXの方法)

    mkfifo foo
    program1 >foo &   # in background
    program2 -in foo -out filename
    rm fifo

通常は標準入力を使用しない多くのプログラムは、理由によりこのように動作します。入力ファイルがシーク可能である必要があることに注意してください。では<bar program2、あなたがのファイルディスクリプタ0にすることができprogram2にポイントをbarシーク可能ですが、一般の標準入力にファイルシーク可能ではないので、このようなプログラムは、それを使用して気にしないでください。上記の各方法では、ファイルがシーク可能であると予想される場合、プログラムが失敗する可能性があります。


1
/ proc / [self] / fd / 0の代わりに/ dev / stdinをお勧めします-POSIXでも必要ではありませんが、/ procよりもはるかに広くサポートされているようです。こちらこちらをご覧ください。
ゴードンデイヴィソン

1

次のようなことができます

program1 > stdin & program2 -in stdin -out filename

これは実際にはパイプではありませんが、program1のすべてのstdoutをstdinファイル内に入れて、program2が読み取れるようにします。

あるいは、一部のプログラムは、シェルからの読み取り/書き込みを試みるときに、短縮表記を使用します。したがって、次のようになります。

program1 | program2 -in - -out filename

1

次の構文は、入力ファイルを特殊ファイルにポイントすることにより、シェルで動作するはずです/dev/stdin

program1 | program2 -in /dev/stdin -out filename
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.