出力を書き込むファイルの名前を渡す必要があるコマンドラインユーティリティを使用しています。
foo -o output.txt
stdout
に書き込むのは、正常に実行されたことを示すメッセージだけです。 output.txt
に書き込まれたすべてを別のコマンドラインユーティリティにパイプできるようにしたいと思います。私の動機は、output.txtが最終的に保持する必要のない40 GBのファイルになることであり、大規模なファイルを段階的に操作するのではなく、ストリームをパイプ処理したいです。
このシナリオでは、実際の出力(つまりoutput.txt
)を別のコマンドにパイプする方法はありますか?どういうわけか魔法のようにstdout
をファイル引数として渡すことができますか?
これを行う最も便利な方法は、プロセス置換を使用することです。 bashでは、構文は次のようになります。
foo -o >(other_command)
(これは bashism であることに注意してください。他のシェルにも同様の解決策がありますが、最終的には移植性がないということです。)
上記を明示的/手動で次のように実行できます。
mkfifo
コマンドを使用して名前付きパイプを作成します。
mkfifo my_buf
そのファイルを入力として他のコマンドを起動します
other_command < my_buf
foo
を実行し、出力をmy_buf
に書き込みます
foo -o my_buf
/dev/stdout
を使用する次のように、デバイスファイル/dev/stdout
を使用することもできます。
foo -o /dev/stdout | other_command
名前付きパイプは正常に動作しますが、bashプロセスの置換を介してより適切で直接的な構文を使用できるため、後で削除する必要がある永続的な名前付きパイプを使用しないという追加の利点があります(プロセスの置換では、舞台裏で一時的な名前付きパイプを使用します)。
foo -o >(other command)
また、出力をコマンドにパイプし、出力をファイルに保存する場合は、次のようにします。
foo -o >(tee output.txt) | other command
私の提案する解決策は必要な30文字以上ではなく18文字しかないため、stackoverflowを幸せにするために、十分に長い文を書きましょう。
foo -o /dev/stdout
UNIXの魔法を使って名前付きパイプを作成することができます:)
パイプを作成する
$ mknod -p mypipe
パイプから読み取るプロセスを開始します
$ second-process < mypipe
パイプに書き込むプロセスを開始します
$ foo -o mypipe
出力ファイル名として/ dev/ttyを使用します。何も出力しない場合は/ dev/nul /を使用するのと同じです。その後|これで完了です。