私は標準的な手段を使用したプロセスの置き換えに精通しています。
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)