なぜ同じことをすると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

これは、シェルが*すべてのファイルに一致する引数のリストを置き換えるためです(aで始まらない.(dotglobがオンになっていない場合))。それでは、echoただそれをやってください。このグローバル交換は次に発生します。みんなこれはコマンドではなくシェルによって実行されるためです。

だから何printf

printf印刷形式です。最初のパラメータは形式です。そうすればprintf "%s " *それがすべてですecho

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

詳細

この試み。何が起こっているのか理解するのに役立ちます。 (実際の目的でこのコードを使用することを提案するものではありません。学習用にのみ使用してください。)

これを試してみてくださいcat /proc/self/cmdline * | less。コマンドラインが最初にどのように見えるかを示します(シェルが作業を終えた後)。

答え2

これは、表示する入力がなく、代わりに*(all)ファイルのリストを引数として文字列として表示するためです。

とても簡単です。

そして*はパラメータです。 「*」の内容をエコーするので、ファイルリストは

関連情報