次の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)ファイルのリストを引数として文字列として表示するためです。
とても簡単です。
そして*はパラメータです。 「*」の内容をエコーするので、ファイルリストは