

例えばLinuxにおいて、カレントディレクトリに下記のような3つのファイルがあった場合、

[code]

    # ls -l
    合計 0
    -rw-r--r-- 1 root root 0 8月 31 21:34 2022 AAA
    -rw-r--r-- 1 root root 0 8月 31 21:34 2022 BBB
    -rw-r--r-- 1 root root 0 8月 31 21:34 2022 CCC
    
[/code]

echo * のコマンドを実行するとこのような表示結果になると思います。

[code]

    # echo *
    AAA BBB CCC
    
[/code]

echoコマンドは渡された情報に*がある場合、カレントディレクトリのファイル名と解釈して処理するようなある種の「仕様」になっているかと思いますが、何故このような挙動になることになったのでしょうか？

自分が知りたいのは仕様決めの経緯や理由みたいなもので、もしかするとドキュメントにも残っていない内容かもしれませんが、*（アスタリスク）を「ワイルドカード」ないし「0文字以上の文字列」のメタキャラクタとして考えるなら、echo
* をただの echo と解釈して下記のような表示結果になっても直感には反しないような気がしています。

[code]

    # echo *
    
    
[/code]

ドキュメントとして残っていればそれが一番良いですが、なければ推測でも構いませんので、きっとこういう理由でそのような仕様になったのだろう、というのがある方がいらっしゃいましたらご教授いただけましたら幸いです。


CC BY-SA 4.0
2022-09-01T08:35:13.723
90871
2022-09-01T10:13:05.120
2022-09-01T09:04:56.067
3060
43186
question
linux bash zsh
Linuxのコマンドラインで echo * を実行するとファイル一覧が表示されるのはなぜ？


いや単に POSIX shell (`bash`, `dash`, `csh`) のコマンドラインにおいては `*` は shell glob
として解釈されるだけの話。 [man
bash](https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html) 起動するコマンドが `echo`
だろうが `ls` だろうが `cat` だろうが全部同じ挙動をします。

そうなった根拠とか理由とかは英語では `rationale` という単語になるでしょうが、もしあるとしたら POSIX
の（仕様確定直後）くらいに文書が出ていればよし、なければ「歴史的理由」ってやつにとどまるでしょう。最初に glob
の挙動を決めた人がそうした理由は推し量るしかないですね。まあその当時 regexp はまだ無かったかもとか、あっても shell
に実装するにはメモリ容量とか CPU 能力とかが足らなかったかもとか、使う側の人間にとって正規表現は複雑すぎたかもとか、なんて推測はできます。

全てのファイルの列挙をするのに正規表現だと任意の１文字の０個以上の繰り返しで `ls .*` って打たなきゃならないとしたら不便すぎません？


CC BY-SA 4.0
2022-09-01T09:27:27.280
90873
2022-09-01T09:27:27.280
8589
90871
answer


挙動としては @774RR
さんの回答の通りで、歴史的にはPOSIX以前の[最初期のUNIX](http://web.archive.org/web/20000829224359/http://cm.bell-
labs.com/cm/cs/who/dmr/man71.pdf)の `/etc/glob`
コマンドが同様の仕様を[引き継いでいる](https://linuxjm.osdn.jp/html/LDP_man-
pages/man7/glob.7.html)ようです。


CC BY-SA 4.0
2022-09-01T09:43:14.867
90874
2022-09-01T09:43:14.867
241
90871
answer


たぶん他の OS (Windowsなど)と比べて, という話かと思いますが  
例えば以下の場合

[code]

    progA *.dat >output
    
[/code]

Windowsや DOSなどでは, `*.dat`などワイルドカードが指定された場合

  1. 無視する (文字列引数として `*.dat` を取得)
  2. ワイルドカードを展開し, ひとつずつ `progA`に渡す (ようなライブラリーをリンク時にリンクする)
  3. あるいはその他

…の動作を選ぶことができます(`progA` のビルド時に)

(一つずつ展開するのは, 一挙にすべて展開するとコマンドラインがパンクするからと思われ)

* * *

UNIX系の OSでは, 標準入出力 (上記の `>output` 部分) なども含め, `*.dat` の展開は「シェル」の役割です  
(参考として) [bash](https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html)
の「パス名展開」, その他に「ブレース展開」「チルダ展開」「パラメータの展開」…など各種の展開があります

その後, 展開されたコマンドラインで `progA` が実行される  
`echo *` の場合も (組み込みコマンドかどうかの違いはあっても) 同様に扱われる

参考:
[https://ja.wikipedia.org/wiki/シェル](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%A7%E3%83%AB)


CC BY-SA 4.0
2022-09-01T10:13:05.120
90876
2022-09-01T10:13:05.120
43025
90871
answer