Bash의 프로세스 대체를 HERE 문서와 결합하는 방법은 무엇입니까?

Bash의 프로세스 대체를 HERE 문서와 결합하는 방법은 무엇입니까?

Bash 버전 4.2.47(1)-릴리스에서 다음과 같이 HERE-dcoument에서 제공되는 형식화된 텍스트를 연결하려고 하면 다음과 같습니다.

cat <(fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
) # I want this paranthesis to end the process substitution.

다음 오류가 발생합니다.

bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
)

또한 나는 HERE 문서를 인용하고 싶지 않습니다. 즉 <'FOOBAR', write 는 여전히 그 안에 대체되는 변수를 갖고 싶기 때문입니다.

답변1

이것은 오래된 질문이며 이것이 인위적인 예라는 것을 알게 되면(따라서 올바른 해결책은 이 경우 사용하거나 cat |실제로는 cat전혀 사용하지 않는 것임) 일반적인 경우에 대한 답변을 게시하겠습니다. 나는 그것을 함수에 넣고 대신 사용하여 문제를 해결할 것입니다.

fmt-func() {
    fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
}

그런 다음 그걸 사용해

cat <(fmt-func)

답변2

프로세스 대체는 대략 이것과 동일합니다.

예 - 프로세스 대체 메커니즘

1단계 - FIFO를 만들고 출력합니다.

$ mkfifo /var/tmp/fifo1
$ fmt --width=10 <<<"$(seq 10)" > /var/tmp/fifo1 &
[1] 5492

2단계 - FIFO 읽기

$ cat /var/tmp/fifo1
1 2 3 4
5 6 7 8
9 10
[1]+  Done                    fmt --width=10 <<< "$(seq 10)" > /var/tmp/fifo1

HEREDOC 내에서 괄호를 사용하는 것도 괜찮은 것 같습니다.

예 - FIFO 사용

1단계 - FIFO로 출력

$ fmt --width=10 <<FOO > /var/tmp/fifo1 &
(one)
(two
FOO
[1] 10628

2단계 - FIFO 내용 읽기

$ cat /var/tmp/fifo1
(one)
(two

당신이 겪고 있는 문제는 프로세스 대체가 <(...)그 안에 괄호 중첩을 신경 쓰지 않는 것 같다는 것입니다.

예 - 프로세스 하위 + HEREDOC이 작동하지 않음

$ cat <(fmt --width=10 <<FOO
(one)
(two
FOO
)
bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOO
(one)
(two
FOO
)
$

parens를 탈출하면 약간 진정되는 것 같습니다.

예 - 괄호 이스케이프

$ cat <(fmt --width=10 <<FOO                 
\(one\)
\(two
FOO
)
\(one\)
\(two

하지만 실제로는 원하는 것을 제공하지 않습니다. parens의 균형을 맞추는 것도 그것을 달래는 것 같습니다.

예 - 괄호 균형 조정

$ cat <(fmt --width=10 <<FOO
(one)
(two)
FOO
)
(one)
(two)

Bash에서 이와 같이 복잡한 문자열이 있을 때마다 나는 거의 항상 먼저 구성하여 변수에 저장한 다음 변수를 통해 사용합니다. 부서지기 쉬운.

예 - 변수 사용

$ var=$(fmt --width=10 <<FOO
(one)
(two
FOO
)

그런 다음 인쇄하려면 다음을 수행하십시오.

$ echo "$var"
(one)
(two

참고자료

답변3

이것은 단지 해결 방법입니다. 프로세스 대체를 사용하는 대신 파이프 fmt로 연결cat

fmt --width=10 <<FOOBAR | cat 
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR

관련 정보