プロセス置換: <(...) & >(...)

プロセス置換という技を使うと、本来ファイルを指定して実行してその中身を使うようなコマンドで、直接文字列を渡すといったことができるようになります。<(...)が入力、>(...)が出力向きになります。

🤔色々と憶測ですが、僕的にはこれは戻り値がファイルのように扱えるワンライナーな関数みたいなイメージでかなと思ってます。

まずLinux 上でstat -c%N /dev/fd/*でどんな/dev/fs/*があるか見ることができます。例えばその中には'/dev/fd/0' -> '/dev/pts/9'というのがあるんですが、この時ターミナル1で、

cat /dev/fd/0

とし、ターミナル2でecho 123 > /dev/pts/9を実行するとターミナル1に123と流せるというような仕組みがあります。echo >(echo)'などと実行する時も/dev/fd/63という結果がでてくるので、どこかからの標準出力が/dev/fd/63に送られてきたりしてるんだろうなと。

これがファイルの代わりとして扱えるのは/dev/fd/63が実際にコマンドが生きてる間存在するファイルか何かなんだと思います。cat /dev/nullが使えるように、(内容が渡ってくる点だけ異なる)ファイルであるならファイルを期待する箇所におけるのはおかしくないかなと。

(⚠️この機能はshでは使えない為、bashを使う必要があります。)

例えばファイルを期待するコマンドの有名なものにcatがあります。これはcat <file-path>でそのファイルパスの内容を表示するコマンドですが、プロセス置換を使うと、

bash -c 'cat <(echo -n 123)'
# 123

<(...)の中の実行結果を表示することができます。この使い方ではechoと変わらないですが、例えばbase64コマンドなどだと少し便利さを感じられます。(これもbase64 <file-path>を期待)

bash -c 'base64 <(echo -n username:password)'
# dXNlcm5hbWU6cGFzc3dvcmQ=

またdiffなどもその類です。

bash -c 'diff <(echo aaa) <(echo abb)'
# 1c1
# < aaa
# ---
# > abb

>(...)にすると前のコマンドの結果をその中のコマンドに続けて渡すことができます。

bash -c 'echo 123 > >(cat)'
# 123