2つの拡張の違い

2つの拡張の違い

ls *とコマンドを入力すると、echo *結果に大きな違いがあることがわかります。前者は再帰的に含まれ、後者はサブディレクトリのファイルを完全に除外します。パス名の拡張に対して異なる動作をしますか?

答え1

lsパラメータとして渡されると、デフォルトではディレクトリの内容が一覧表示されます。これを*シェルに渡すと、あなたの殻*現在の作業ディレクトリ内のすべてのファイルとディレクトリに展開し、対応するパラメータを取得lsして処理します。その結果、指定されたディレクトリの内容と現在の作業ディレクトリのファイルが一覧表示されます。

echoシェル拡張の場合、*echoは引数として渡されたコンテンツのみを印刷するため、ディレクトリの内容を取得できません。

lsディレクトリの内容が表示されないように指示するために使用できますls -d *

この設定を考慮すると:

$ mkdir dir{1,2}
$ touch file{1..3} dir{1,2}/morefiles{1..5}
$ ls
dir1  dir2  file1  file2  file3

*シェルに渡され、bashが*に拡張されますdir1 dir2 file1 file2 file3echowithを使用する*と、echoシェルの拡張内容が表示されます*

$ echo *
dir1 dir2 file1 file2 file3

ただし、デフォルトで指定されたディレクトリ引数は、リストされlsたディレクトリの内容を拡張します。

$ ls *
file1  file2  file3

dir1:
morefiles1  morefiles2  morefiles3  morefiles4  morefiles5

dir2:
morefiles1  morefiles2  morefiles3  morefiles4  morefiles5
$ 

*onを削除するかls(例のディレクトリ構造を作成した後に表示されます)、私の答えで述べたように、次のものを使用できますls -d *

$ ls -d *
dir1  dir2  file1  file2  file3

lsこれにより、およびの内容の表示が停止します。dir1/dir2/

答え2

DravSloanの優れた答えを明確にするために違いはありません。*どちらの場合もシェルによって拡張され、どちらの場合もまったく同じものに拡張されます。違いは、彼らの主張を扱う方法echols処理にあります。

echo指定した各パラメータのみが印刷されます。ls〜するlist directory contentsマニュアル通りです。したがって、どちらの場合も、シェルは左(echoまたはls)にあるプログラムを実行し、そのプログラムは各引数に対して実行する必要がある操作を実行します。*拡張子が異なるためではなく、プログラムが異なるため、結果は異なります。

関連情報