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

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

Bash 버전 4.2.47(1) 릴리스에서 다음과 같이 HERE 문서의 서식 있는 텍스트를 연결하려고 하면 다음과 같습니다.

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 문서(예: write )를 참조하고 싶지 않습니다. <'FOOBAR'왜냐하면 여전히 거기에 있는 변수를 바꾸고 싶기 때문입니다.

답변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
)
$

대괄호를 이스케이프하면 약간 진정되는 것 같습니다.

예 - 괄호 이스케이프

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

하지만 실제로 원하는 것을 제공하지는 않습니다. 대괄호를 균형있게 만드는 것도 그것을 달래는 것 같습니다.

예 - 대괄호

$ 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

관련 정보