なぜ同じようにecho解釈するのか*ls

なぜ同じようにecho解釈するのか*ls

これらのshellコマンドを検討してください

$ls
my_app  newlist  note

そして

$echo *
my_app  newlist  note

そして

$printf *
my_app

最初のコマンドはls、ファイルに関する情報を一覧表示します (デフォルトでは現在のディレクトリ)。 2 番目のコマンドechoは、引数として渡される文字列を出力するコマンドです。 ただし、入力すると、echo *と同じものが出力されますls

最初のファイル名だけprintf *を出力として返す

なぜをこのようにecho解釈するのでしょうか*?printfさらに奇妙なことに、最初の だけを出力するのはなぜでしょうか?

答え1

なぜ同じようにecho解釈するのか*ls

答えは簡単です。違います。echoまさにあなたがおっしゃるとおり、引数を反復処理し、間にスペースを入れて出力します。

では、なぜこのような動作が見られるのでしょうかls?

これは、シェルが を*すべてのファイルに一致するパラメータリストに置き換えるためです(.ドットグロブがオンでない限り、 で始まっていません)。その後、echoシェルは処理を実行します。このグロブ置換は、全てコマンドではなくシェルによって実行されるためです。

では、 についてはどうでしょうかprintf?

printfは印刷フォーマットです。最初の引数はフォーマットです。 とするとprintf "%s " *、 のようになりますecho

最初のファイルが の場合hello%sworld、次のようになります:hellofile2world hellofile3world

さらに詳しく

これを試してみてください。何が起こっているかを知るのに役立ちます。(このコードを実際に使用することをお勧めしているわけではありません。学習目的で使用してください)。

試してみてくださいcat /proc/self/cmdline * | less- 最初に、コマンド ラインがどのようになるかが表示されます (シェルが機能を実行した後)。

答え2

表示する入力がなく、文字列として表示するパラメータとして*(すべての)ファイルのリストがあるためです。

それほど単純な

*はパラメータですが、"*"の内容をエコーするので、ファイルのリストは

関連情報