括弧には、コマンド終端を明確にする役割以外に、
複数のコマンドをまとめる役割もある。

開き括弧はコマンドの一種であり、
コマンドを書く場所であればどこでも利用できる。

コマンドプロセッサが開き括弧を見つけた場合、
コマンド行を記憶するモードに入る。
その後のコマンドは、記憶されるがすぐに実行はされない。

閉じ括弧が見つかった時点で、
今まで入力されたコマンドが一気に実行される。

C:\>(
More? echo hello
More? echo world
More? )
hello
world

一見意味がなさそうだが、コマンドプロンプト上で、
処理に時間が掛かるコマンドを含めて複数行入力する際に、
先のコマンドまで一気に入力してから実行させることができる。

普通に入力してしまうと、
最初のコマンドが実行されている間は、
コマンド入力ができなくなるのだ。

実際には入力バッファが記憶しているので入力はできるが、
画面に表示されないので、入力ミスの可能性が高くなる。
また、最初のコマンドが入力を必要とするコマンドの場合、
そちらに入力が取られてしまう。


括弧がコマンドの一種と言ったのは、
コマンド引数として使った場合はただの文字となるからだ。
例えば、以下のように引数として開き括弧を書いても、
括弧が特別扱いされることはない。

C:\>echo open paren(
open paren(

閉じ括弧は、通常時はただの文字だが、

C:\>echo close paren)
close paren)

記憶モードの際は、ダブルクォート内を除く任意の場所で
記憶モード終了としての強い優先順位を持つ。

C:\>(
More? echo close paren)
close paren

また、開き括弧から閉じ括弧までのあいだは、
名前を持たない 1 つのコマンドとして解釈される。
便宜上、「括弧」コマンドと呼ぶことにしよう。

「括弧」コマンドは引数を持たないため、
閉じ括弧の後に改行以外の文字が入ると、
それは「括弧」コマンドの引数と解釈されエラーとなり
「括弧」コマンド自体の実行に失敗する。

C:\>(
More? echo close paren) others
others was unexpected at this time.

つまり、閉じ括弧は独立した行に単独で書く方が失敗がない。

さて、明日は、「括弧」コマンドを
if や for と組み合わせてみよう。