
これらの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
表示する入力がなく、文字列として表示するパラメータとして*(すべての)ファイルのリストがあるためです。
それほど単純な
*はパラメータですが、"*"の内容をエコーするので、ファイルのリストは