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)

관련 정보