コマンドリストと}の間の区切り記号

コマンドリストと}の間の区切り記号

Bashのマニュアルによると

{ list; } 

中かっこの間にコマンドリストを配置すると、そのリストは現在のシェルのコンテキストで実行されます。サブシェルは作成されません。リストの後にはセミコロン(または改行)が必要です。

中かっこは予約語なので、スペースやその他のシェルメタ文字でリストと区切る必要があります。

括弧は、空白でリストと区別されなくても、シェル内の別々のトークンとして認識される演算子です。

次のようにセミコロンを削除すると:

$ { date }
>
  1. 標準入力が必要なのはなぜですか?

  2. メタ文字は単語を区切る文字です。セミコロンとスペースは「シェルメタ文字」です。なぜ単語dateとスペースを区別できないのです}か?単語を区別するためにスペースの代わりにセミコロンが必要なのはなぜですか?

答え1

  1. 締め切りを待っています}。コマンドと改行文字を含むリストを入力したので、date }まだコマンドグループ内にあるので、リストに他のコマンドを追加または終了できます。

    したがって、標準入力(正確に)を待つのではなく、最初の行から始まるコマンドが完了するのを待ちます。ここに入力すると、コマンドが}date」を理解していないというエラーメッセージが表示されます}

  2. {}ポイント1に示すように、一般コマンドの有効なパラメータです。例えば、findパラメータとして使用されます{}

    具体的には、" {"と" }"のみです。予約語。シェルの予約語は完全な単語のまま提供され、特に必要な場合にのみ意味があります。彼らが期待する最も重要なことはスタートコマンド。

    }リストの次のコマンドの先頭に表示されるセミコロンまたは改行文字は、予約語として認識され、特別に処理できます。これシェル構文に対してPOSIXで指定:

    <newline>この規則はまたaまたは<semicolon>;次のように、入力の特定の場所を除いて、予約語が認識されないことを意味します。文法は、予約語を意図した場合、ユーザーがそれを正しく区別したと仮定します。

    他の予約語「then」を通常の単語として使用できない場合は、迷惑なことになるので、基本的にこれは意味があります。対照的に、(and)はどこにでも現れ、リテラル値に使用される場合にエスケープする必要がある演算子です。これは本質的に歴史的な遺物であり、やり直す場合は、一方向または別の方向でより一貫した選択が行われるか、より複雑なパーサーが必要になる場合があります。


特に、Bashの場合、コマンドのグループ化括弧も次のようにする必要があります。支柱の拡張、パーサーは、スペースで始まるコマンドを中括弧で拡張する可能性がないと仮定します。

極端なケースに対する過去の互換性を維持することはオプションであり、他のシェル(zshなど)にはよりスマートなパーサーがあり、必要な{ date }意味を処理できます。

答え2

  1. コマンドが完了するのを待っています。不完全なif、while、または何かを書く場合でも同じことが起こります。

    $ if date
    >
    
  2. コマンドはマニュアルで明確に定義されています。 Aは{ list; }複合コマンドです。

    複合コマンド

    {list; }リストは改行またはセミコロンで終わる必要があります。

    そこには「改行またはセミコロンで終了」と明確に記載されています。

関連情報