Bashバージョン4.2.47(1)-ここから来るフォーマットされたテキストを連結しようとするとリリース-次のような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
)
また、ヒアドキュメントを引用したくありません。つまり、<'FOOBAR'
と記述します。 、変数をその中で置換したいので。
承認された回答:
プロセス置換はこれとほぼ同等です。
例–プロセス置換の仕組み
ステップ#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
ヒアドキュメント内でのパレンの使用も問題ないようです:
例–FIFOを使用するだけ
ステップ#1-FIFOへの出力
$ fmt --width=10 <<FOO > /var/tmp/fifo1 &
(one)
(two
FOO
[1] 10628
ステップ#2 –FIFOの内容を読み取る
$ cat /var/tmp/fifo1
(one)
(two
問題は、プロセス置換<(...)
に遭遇していると思います。 、その中の親の入れ子を気にしていないようです。
例–プロセスサブ+ヒアドキュメントが機能しない
$ 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で処理する場合は常に、トリッキーな1つのライナーを作成して作成するのではなく、ほとんどの場合、最初にそれらを作成して変数に格納してから、変数を介して使用します。壊れやすい。
例–変数を使用する
$ var=$(fmt --width=10 <<FOO
(one)
(two
FOO
)
次に、それを印刷するには:
$ echo "$var"
(one)
(two
参考資料
- プロセス置換
- ヒアドキュメントをbashスクリプトでファイルに書き込むにはどうすればよいですか?
- 名前付きパイプの使用とプロセス置換
- ヒアドキュメントの括弧を閉じる