bash中括弧拡張がコマンドに対して機能しないのはなぜですか?

bash中括弧拡張がコマンドに対して機能しないのはなぜですか?

これが機能する理由:

mkdir /dir/test{1,2,3}

そうではありませんか?

{chown httpd,chmod 700} /dir/test1
-bash: {chown: command not found

私のBashバージョンは次のとおりです。GNU bash、バージョン4.2.46(2) - リリース

答え1

中かっこ拡張が無効です。支柱の拡張は次のとおりです。言葉シェルに。

単語は引用符なしの空白(デフォルトではタブまたは改行)で区切られた文字列です。文字列は3つの別々の単語で構成され、中括弧{chown httpd,chmod 700}拡張{chmodとして認識されません。http,chmod700}

代わりに、シェルは行を{chownコマンドとして解釈し、引数とともに実行しますhttp,chmod700}/dir/test1

これをテストする最も簡単な方法は次のとおりですecho

$ echo {chown httpd,chmod 700} /dir/test1
{chown httpd,chmod 700} /dir/test1

$ echo {"chown httpd","chmod 700"} /dir/test1
chown httpd chmod 700 /dir/test1

中括弧拡張が機能しても、このコマンドは意味がありません。

2つのコマンドを書くだけです。

chown http /dir/test1
chmod 700  /dir/test1

答え2

マニュアルページで述べたように、bashは各単語に対して中括弧拡張を実行するためです。後ろにコマンドラインを単語に分割します。

{chownしたがって、コマンドラインは最初に、およびhttpd,chmodに分割されます。700}その後、{chown有効な中括弧拡張モードではないため、そのまま残り、bashはその名前でコマンドを実行しようとします。

マンページの引用は次のとおりです。

拡張はコマンドラインから行われます。単語で割った後。中括弧拡張、チルダ拡張、パラメータおよび変数拡張、コマンド置換、算術拡張、トークン化、パス名拡張など、7 種類の拡張が実行されます。

zsh他のシェル(算術拡張の後に中括弧拡張が続き、追加の単語の分離はまったく行われません)とは異なり、順序に注意してください。

以下は、または1 2で印刷されます。zshkshx ybash

f=; f1=x; f2=y; echo $f{1,2}

答え3

他の回答では、支柱の拡張が機能しない理由をすでに説明しました。今はこの問題を無視し、ファイル名が重複するのを避けたいかもしれません。ファイル名を変数に割り当てるか、$_特殊変数(前のコマンドの最後のシェル語を含む)を使用してください。

f="some long and ugly filename"
chown httpd "$f"
chmod 700 "$f"

または

chown httpd "some long and ugly filename"
chmod 700 "$_"

関連情報