Quando você usa a sintaxe <(cmd)
, o que normalmente acontece é que o "cmd" é executado com stdout conectado a um descritor de arquivo temporário e o nome do arquivo desse descritor retornado, para que possa ser usado como um parâmetro
por exemplo
ksh$ echo <(echo hello)
/dev/fd/4
bash$ echo <(echo hello)
/dev/fd/63
Agora que /dev/fd/##
entry só é válido no escopo do shell que está chamando <(..)
porque /dev/fd
é um link simbólico para /dev/self/fd
.
Isso significa que no seu exemplo de data=@$(echo <(head -c1M /dev/urandom))
if será analisado como se você tivesse digitado data=@/dev/fd/63
, mas isso não funcionaria porque o shell que está executando o comando curl
não é o shell que tinha a subsituição do processo.
Agora, <(...)
pode ser incluído em outras entradas e funcionará, contanto que você não passe os nomes de arquivos temporários
por exemplo, isso não funcionará
$ cat <(echo <(echo hello))
/dev/fd/63
mas isso irá funcionar
$ cat <(cat <(echo hello))
hello
Na sua versão, porém, você tem um nível desnecessário de indireção e deve ser capaz de simplesmente fazer
data=@<(head -c1M /dev/urandom)