角かっこがシェル拡張を防止するのはなぜですか?

角かっこがシェル拡張を防止するのはなぜですか?

「4800483343」はディレクトリで、「file1」と「file2」はその中にある2つのファイルです。

なぜ次のような状況が発生しますか?

$ ls 4800483343
file1 file2

$ md5sum 4800483343/*
36468e77d55ee160477dc9772a99be4b  4800483343/file1
29b098f7d374d080eb006140fb01bbfe  4800483343/file2

$ mv 4800483343 4800[48]3343

$ md5sum 4800[48]3343/*
md5sum: 4800[48]3343/*: No such file or directory

$ md5sum '4800[48]3343'/*
36468e77d55ee160477dc9772a99be4b  4800[48]3343/file1
29b098f7d374d080eb006140fb01bbfe  4800[48]3343/file2

この問題を引き起こす可能性がある他の文字は何ですか?

ベストアンサー1

元の質問に答える

角かっこがシェル拡張を防止する理由

角かっこはシェルの拡張を防ぎませんが、引用符は避けます。

実際に実行したコマンドは次のようになりました。

これにより、次のファイルでmd5sumが実行されますdir/

$ md5sum d[i]r/*
02fdd7309cef4d392383569bffabf24c  dir/file1
db69ce7c59b11f752c33d70813ab5df6  dir/file2

これにより、角かっこが拡張されないように引用符がdir移動されます。d[i]r

$ mv dir 'd[i]r'

dirもう存在しないディレクトリを探します。

$ md5sum d[i]r/*
d[i]r/*: No such file or directory

引用符のため、次のエントリは次の名前の新しいディレクトリにありますd[i]r

$ md5sum 'd[i]r'/*
02fdd7309cef4d392383569bffabf24c  d[i]r/file1
db69ce7c59b11f752c33d70813ab5df6  d[i]r/file2

修正された質問に答えてください

修正された質問にはディレクトリ4800483343があり、次のコマンドが実行されます。

mv 4800483343 4800[48]3343

このコマンドを実行したときに発生することは、globが4800[48]3343既存のディレクトリと一致するかどうかによって異なります。一致するディレクトリがない場合は、それ自体が4800[48]3343展開され、4800[48]3343ディレクトリ4800483343がディレクトリに移動します4800[48]3343

ついに:

  1. このコマンドは、md5sum 4800[48]3343/* globと一致するディレクトリがないため、「該当するファイルまたはディレクトリがありません」というエラーを返します4800[48]3343

  2. 引用符はグローバル拡張を防ぐため、このコマンドはmd5sum '4800[48]3343'/*ファイルを正しく検索します。

グローバル例

2つのファイルを作成しましょう。

$ touch a1b a2b

次の球を見てみましょう。

$ echo a[123]b
a1b a2b
$ echo a?b
a1b a2b
$ echo *b
a1b a2b

おすすめ記事