Linuxでの入出力とパイプリダイレクトについてはすでにご存知でしょう。
プロセス置換と呼ばれる、類似しているが高度な機能について説明します。
プロセス置換には2種類の構文があります。
<(commands)
または
>(commands)
もう少し詳しく説明します。
プロセス置換は、STDOUTまたはSTDINリダイレクトと同様に使用できることがわかります。
<(commands)
を使用 演算子、あなたは置換から読みます。これは、commands
を意味します stdout
として使用するように設定されています 。
たとえば、次のコマンドはls *sh
の出力を使用します :
wc -l <(ls *sh)
これは次と同等です:
ls *sh | wc -l
>(commands)
を使用 演算子、あなたは置換に書き込みます。これは、commands
を意味します stdin
として使用するように設定されています 。
つまり、ファイルに出力するコマンドがあるが、ファイルではなく他のコマンドに書き込みたい場合。
これは、物事をもう少し明確にする必要がある例です:
tar -cf >(ssh remote_server tar xf -) .
あなたはそれが何をするのか分かりますか?それは正しい。現在のディレクトリのすべての内容をリモートサーバーに転送しました。アーカイブファイルはその場で作成され、サーバー上で抽出されます。
正直なところ、>(...)
演算子はあまり一般的ではありません。 <(...)
が見つかります より頻繁に使用できます。
では、通常の入出力リダイレクトのように機能する場合、プロセス置換の利点は何ですか?
1つのコマンドに結合する複数のコマンドパイプラインがある場合、bashプロセス置換の能力と有用性を実感できます。
プロセス置換の最も明白で最も頻繁な使用は、2つのプログラムの出力の比較です。実例を挙げてお見せしましょう。
ディレクトリに同じ名前のCプログラムファイルとそれに対応するオブジェクトファイル(.outファイル)があるとします。
ls *
aa.c aa.out bb.c bb.out cc.c cc.out ...
これがあなたの目的です。各Cファイルに、Cファイルと同じ名前の対応する出力ファイルがあるかどうかを確認する必要があります。
一般的なアプローチは、拡張子でフィルタリングされたファイルを一覧表示してから、区切り文字。(dot)を指定してcutコマンドを使用し、拡張子なしでファイル名を抽出することです。
ls *.c | cut -d. -f1
aa
bb
cc
dd
一般的なアプローチは、*。cファイルと* .outファイルの出力を一時ファイルに保存してから、これらのファイルをdiffコマンドで比較することです。私は正しいですか?
ls *.c | cut -d. -f1 > c.txt
ls *.out | cut -d. -f1 > out.txt
diff c.txt out.txt
rm c.txt out.txt
/ tmpディレクトリを使用して一時ファイルを作成することもできますが、それでも3行のコマンドがあります。
プロセス置換を美しく使用して、一時ファイルを作成せずに上記のすべてを1つのコマンドに置き換えることができます。
diff <(ls *.c | cut -d. -f1) <(ls *.out | cut -d. -f1)
ここで一時ファイルを作成する必要はありませんでした。それが重要です。これが、プロセス置換をいつ使用すべきかについての私のヒントです。
何かをするために一時ファイルが必要だと思うときはいつでも、プロセス置換を使用できるかどうかを検討してください。
プロセス置換はbash機能であり、他のシェルで機能する場合と機能しない場合があります。
将来的にはプロセス置換を試してみてください。ご覧のとおり、非常に便利です。ご質問やご提案をお待ちしております。