ディレクトリに何千ものファイルがある光沢のあるファイルシステムでは、入力するたびにファイルが一覧ls
表示されるまで膨大な遅延が発生します。ファイルリストを必要とする他のコマンドでも同じことが起こります。ただし、入力するとecho *
ファイル名をすばやく知ることができます。
ls
ファイルシステムにアクセスする同様のコマンドと比較して、機械的/内部的な違いは何ですかecho *
?次はどうなりますか?
答え1
ls
ファイル名をきれいにリストする操作が必要です。また、名前のレンダリング方法(色または他のファイル形式を表す)に関する情報が必要であり、各ディレクトリエントリに関連するメタデータの詳細も含めることができます。以下はCygwinのインストール例です。
cd /bin
ls
[.exe cygpstoedit-0.dll mpost.exe
__pycache__ cygptexenc-1.dll msgtool.exe
a2ping cygraqm-0.dll msxlint.exe
a5toa4 cygraw_r-16.dll mv.exe
acyclic.exe cygraw-16.dll named-rrchecker.exe
addftinfo.exe cygreadline7.dll namei.exe
...
直接的な関係はありませんが、実験してみると、ls
最も長いファイル名の長さによって列の幅が異なることがわかります。これを行うには、ls
ファイル名が出力される前に各ファイル名を読み、考慮する必要があります。最新バージョンでは、ls
「奇妙な」ファイル名と一重引用符の中にスペースを含むファイル名が表示されることがあります。 (個人的には設定でこの機能を無効にしますQUOTING_STYLE=literal
。)
echo
それ自体は賢いものではありませんが、シェルは*
ファイル名の英数字リストに展開し、そのリストを直接単語に渡しますecho
。これは次のディレクトリですecho
。
cd /bin
echo *
[.exe __pycache__ a2ping a5toa4 acyclic.exe addftinfo.exe addr2line.exe adhocfilelist afm2pl.exe afm2tfm.exe aleph.exe allcm allec allneeded animate apropos ar.exe arara arch.exe arlatex as.exe ascii.exe ash.exe autosp.exe awk axohelp.exe b2sum.exe banner.exe base32.exe...
ls
あなたが見るのは、シェルがきれいなリストを生成するために実行される処理よりもはるかに速くファイル名のリストを抽出することです。 GNUではls
表示処理を無効にできますls -f
。 (man ls
実際に何をしているのか確認してください。)
答え2
コマンドを実行する前に、現在のシェルはスペースで区切られた*
ファイルのリスト(ファイルから読み取られると仮定)に置き換えられます。.
echo
echo
スペース間の各文字シーケンスは単語として扱われ、スペース文字で区切られた単語のリストが出力されます。言い換えれば、複数の空白は単語区切り文字の 1 つだけとして扱われます。したがって、ファイル名にスペースまたは特殊文字が含まれている場合、ファイルの正確な名前が出力から変更される可能性があります。
ls
.
現在のディレクトリのファイルのリストを含むファイルにアクセスし、<new line>
文字で区切られたファイル名を印刷します。