なぜ同じことをすると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。コマンドラインが最初にどのように見えるかを示します(シェルが作業を終えた後)。

おすすめ記事