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 file3
。echo
withを使用する*
と、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の優れた答えを明確にするために違いはありません。*
どちらの場合もシェルによって拡張され、どちらの場合もまったく同じものに拡張されます。違いは、彼らの主張を扱う方法echo
とls
処理にあります。
echo
指定した各パラメータのみが印刷されます。ls
〜するlist directory contents
マニュアル通りです。したがって、どちらの場合も、シェルは左(echo
またはls
)にあるプログラムを実行し、そのプログラムは各引数に対して実行する必要がある操作を実行します。*
拡張子が異なるためではなく、プログラムが異なるため、結果は異なります。