GNU/Linux >> Linux の 問題 >  >> Linux

Bashのプロセス置換をヒアドキュメントと組み合わせる方法は?

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スクリプトでファイルに書き込むにはどうすればよいですか?
  • 名前付きパイプの使用とプロセス置換
  • ヒアドキュメントの括弧を閉じる
関連:Oracle DBプロセスがUnixで実行されているかどうか、およびOracle DBがインストールされている場所を確認するにはどうすればよいですか?
Linux
  1. バックスラッシュ文字で終わるすべての行を組み合わせるにはどうすればよいですか?

  2. 一部のコマンドでBashプロセス置換が機能しないのはなぜですか?

  3. 名前にフレーズが含まれているプロセスを強制終了する方法は??

  1. 「tar」コマンドと「find」コマンドを組み合わせる方法

  2. killコマンドを使用してpidn番号でLinuxでプロセスを再起動しますか?

  3. 親 1 で <defunct> プロセスを強制終了する方法

  1. Linuxでゾンビプロセスを強制終了する方法

  2. Linux –ツリーとディレクトリサイズを組み合わせる方法は?

  3. Rsync〜/ foo Target / fooはRsync〜/ foo / Target / foo /と同じですか?