Bashプロセス置換をパラメータ拡張の一部として使用できますか?

Bashプロセス置換をパラメータ拡張の一部として使用できますか?

私は標準的な手段を使用したプロセスの置き換えに精通しています。

diff <(ls /folder1) <(ls /folder2)

しかし、プロセスに引数が必要なときに使用できますか?いいえただ表現の道?例えば

curl -XPOST https://host:1234/upload -F data=@$(echo <(head -c1M /dev/urandom))

内部置換が外部プロセスではなくサブシェルプロセスに存在するため、機能しません。それにもかかわらず、これが実際に私が達成したいものです。

ベストアンサー1

その構文を使用する<(cmd)ときによく起こるのは、「cmd」が一時ファイル記述子に関連付けられたstdoutとして実行され、その記述子のファイル名が返されるため、引数として使用できることです。

例えば

ksh$ echo <(echo hello)
/dev/fd/4

bash$ echo <(echo hello)
/dev/fd/63

このエントリは、シンボリックリンクと同様に、/dev/fd/##コールシェルの範囲内でのみ有効になりました。<(..)/dev/fd/dev/self/fd

これは、あなたの例でdata=@$(echo <(head -c1M /dev/urandom))ifが入力したように解析されますが、コマンドが実行されるシェルがプロセス置換を実行するシェルではないdata=@/dev/fd/63ため、機能しないことを意味します。curl

<(...)他のエントリに含めることができ、一時ファイル名を渡さない限り動作します。

たとえば、これは機能しません

$ cat <(echo <(echo hello))
/dev/fd/63

しかし、これは〜する働く

$ cat <(cat <(echo hello))
hello

ただし、バージョンには不要なレベルの間接参照があるため、単に次のことができるはずです。

data=@<(head -c1M /dev/urandom)

おすすめ記事