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