サポート拡張

サポート拡張

私はそれが中{かっこ拡張で動作することがわかりました。

echo {1..8}

またはコマンドグループから:

{ls;echo hi}

Bashはどう違いますか?

ベストアンサー1

簡単な理由は、文字が存在するためですspace

ブレーキ拡張は(引用されていない)スペースを処理しません。

リストには{...}(引用されていない)スペースが必要です。

より詳細な答えはシェルがコマンドラインを解析する方法


コマンドラインを解析(理解)する最初のステップは、コマンドラインをさまざまな部分に分割することです。
これらの部分(しばしば単語またはトークンと呼ばれる)は、各メタ文字でコマンドラインを分割して生成されます。リンクから:

  1. コマンドを固定メタ文字セット(SPACE、TAB、NEWLINE、;、(、)、<、>、|、および&)で区切られたトークンに分割します。トークンの種類には、単語、キーワード、I/O リダイレクタ、セミコロンが含まれます。

メタ文字:spacetabenter;,<>|&

分割後の単語は特定の種類を持つことができます(シェルが理解するように)。

  • コマンド事前割り当て: LC=ALL ...
  • 注文する LC=ALL echo
  • 議論 LC=ALL echo "hello"
  • リダイレクト LC=ALL echo "hello" >&2

サポート拡張

「中括弧で囲まれた文字列」(スペースまたはメタ文字を除く)が(上記のように)単一の単語である場合にのみ引用しない、これは「ブラケット拡張」の候補です。内部構造のさらなる検査は後で行われる。

したがって、これは「分岐拡張」に適しており、asまたは(bashではzshが異なります)に{ls,-l}なります。ls -lfirst wordargument

$ {ls,-l}            ### executes `ls -l`
$ echo {ls,-l}       ### prints `ls -l`

しかし、これはそうではありません:{ls ,-l}。 Bashは行を分割しspaceて2つの単語に解析し、以下を実行します{ls(パラメータがありません)。,-l}command not found,-l}

 $ {ls ,-l}
 bash: {ls: command not found

あなたの行:{ls;echo hi}「サポート延長」にはなりません。なぜなら二つメタ文字;space

これは3つの部分に分けられます。{ls新しいコマンド:echo hi};新しいコマンドの開始をトリガーする要素を学びます。このコマンドは{ls見つかりません。次のコマンドは以下を印刷しますhi}

$ {ls;echo hi}
bash: {ls: command not found
hi}

別のコマンドの後に配置すると、とにかく新しいコマンドが始まります;

$ echo {ls;echo hi}
{ls
hi}

リスト

「複合コマンド」の1つは「ブランチリスト」(マイワード)です{ list; }
ご覧のとおり、空白と終端として定義されています;。空白が必要で、
どちらも「予約」されているので、;{}性格」。

したがって、単語として認識されるには、メタ文字で囲む必要があります(ほぼ常に:)space

ポイント2で述べたようにリンクページ

  1. 各コマンドの最初のトークンが....、{、または(場合は、コマンドが実際に複合コマンドであることを確認してください)。

あなたの例:{ls;echo hi}リストではありません。

終了者;とスペースが(少なくとも)必要です{。最後の単語は}閉じる単語として定義されます;

ここにリストがあります{ ls;echo hi; }。これも{ ls;echo hi;}(あまり一般的に使用されていませんが効果的です)(助けてくれた@chorobaに感謝します)。

$ { ls;echo hi; }
A-list-of-files
hi

ただし、コマンドの引数(シェルは違いを知っています)でエラーが発生します。

$ echo { ls;echo hi; }
bash: syntax error near unexpected token `}'

しかし、シェルが構文解析していると思うことに注意してください。

$ echo { ls;echo hi;
{ ls
hi

おすすめ記事