나는 표준 수단을 사용한 프로세스 대체에 익숙합니다.
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)