「*」が他のコマンドで異なる動作をするのはなぜですか?

「*」が他のコマンドで異なる動作をするのはなぜですか?

たとえば、inはrm -r abc* "*"すべての文字列を意味します。ただし、touch abc* abcd* abcde*これをinで使用すると(そしてabc、abcd、またはabcdeで始まるディレクトリにファイルがない場合)、"*"これはシンボルのみを意味し、abc* abcd* abcde*ファイルが生成されます。後でファイルを使用すると、touch -m ab*変更時間がabc* abcd* abcde*変更されます。

場合によっては文字列を意味し、"*"他の場合は記号のみを意味するのはなぜですか?コンピュータはいつ意味を変えなければならないかをどうやって知ることができますか?

ベストアンサー1

引用符のないパターンがシェルで使用される場合、abc*シェルはそれを使用可能なファイル名と一致させようとします(これは「ファイル名の生成」と呼ばれますが、しばしば「グロービング」とも呼ばれます)。ファイル名と一致できない場合、ほとんどのsh類似シェルはパターンを拡張せずにそのままユーティリティに渡します。

例:

$ touch xyz
$ touch abc*
$ tree
.
|-- abc*
`-- xyz

0 directory, 2 files
$ touch xyz*
$ tree
.
|-- abc*
`-- xyz

0 directory, 2 files

このtouch xyz*コマンドが実行されました。いいえファイル名がパターンと一致するxyz*ため、名前付きファイルを作成します。したがって、ユーティリティは対応するファイル名で呼び出されます。xyztouchxyz

シェルでシェルオプションをbash設定すると、シェルグロブが何も一致しない場合、シェルは文句を言います。failglobshopt -s failglob

$ shopt -s failglob
$ touch 123*
bash: no match: 123*

デフォルトでは、そのオプションはzshシェルでオンになっています。

nullglobbash(or)でNULL_GLOBシェルオプションを設定すると、zshファイル名と一致しないとパターンが消えます。

$ shopt -s nullglob
$ touch fo*
usage: touch [-acm] [-d ccyy-mm-ddTHH:MM:SS[.frac][Z]] [-r file]
             [-t [[cc]yy]mmddHHMM[.SS]] file ...

touch(パラメータなしで呼び出されたためエラーが発生します)

パターンが(現状のまま)文字列として使用されていることを確認し、いいえワイルドカードの場合は、これを引用する必要があります。

$ touch "file*"
$ touch "file**"
$ touch "file***"
$ tree
.
|-- file*
|-- file**
`-- file***

0 directory, 3 files

この例では、ファイル名を引用しない場合とパターンが名前と一致するため、名前付きファイルのみが提供されますfile*(ディレクトリが最初に空の場合)。file**file***file*

おすすめ記事