私はそれが中{
かっこ拡張で動作することがわかりました。
echo {1..8}
またはコマンドグループから:
{ls;echo hi}
Bashはどう違いますか?
ベストアンサー1
簡単な理由は、文字が存在するためですspace。
ブレーキ拡張は(引用されていない)スペースを処理しません。
リストには{...}
(引用されていない)スペースが必要です。
より詳細な答えはシェルがコマンドラインを解析する方法。
コマンドラインを解析(理解)する最初のステップは、コマンドラインをさまざまな部分に分割することです。
これらの部分(しばしば単語またはトークンと呼ばれる)は、各メタ文字でコマンドラインを分割して生成されます。リンクから:
- コマンドを固定メタ文字セット(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 -l
first word
argument
$ {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で述べたようにリンクページ
- 各コマンドの最初のトークンが....、{、または(場合は、コマンドが実際に複合コマンドであることを確認してください)。
あなたの例:{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