エコー前にenvディレクトリが呼び出されるのはなぜですか?

エコー前にenvディレクトリが呼び出されるのはなぜですか?

Cで書かれたプログラムを見ています。このプログラムの問題は、このコード行に依存します。

system("/usr/bin/env echo and now what?");

私はsystem()がコマンドを実行していることを知っています。しかし、なぜこれが起こるのかよくわかりません。

しばしばそれは「エコ、今はどうですか」です。ところで、なぜ「usr/bin/env」を前にする必要がありますか?それはまさにどんな役割を果たしますか?

答え1

/usr/bin/envプログラム名の後にプログラムを実行します。環境変数で構成されたディレクトリで、実行可能ファイルとしてプログラム名を見つけますPATH。これは:次にいくつかの環境変数の割り当て、次にプログラム名と引数をenv使用する特別なケースです。これには正確にゼロの変数割り当てがあります。env

/usr/bin/env echo …/bin/echo …パスをハードコーディングしないこと以外は同じです。echoシステムと値に応じて、、、、、、、、…PATH/bin/echo/usr/bin/echo/usr/xpg4/echo/usr/ucb/echo/usr/local/bin/echo/home/bob/bin/echo

ほとんどすべてのシェルに組み込みechoコマンドがあります。シェル組み込みコマンドと外部コマンドの動作に違いがある可能性があります。実際、echo2 つの点でコマンド間に違いがあります。最初の引数が次に始まるとどうなるか-(一部のechoバージョンでは複数のオプションを処理する)バックスラッシュを処理する方法(一部のバージョンでは文字通り印刷し、他のバージョンではエスケープ文字として扱う)。したがって、echoこれらの実装依存の動作を使用したい場合は、強制バージョンが役に立ちます。ほとんどの場合、使用する方が良いですprintf。アンティークを除いて、持ち運び可能で持ち運びできるprintfすべての機能を実行します。echo

サンプルコードに渡されたパラメータを使用すると、エコー実装の選択は重要ではありません。この狂気の理由があれば、それを見つけるためにもう少しコンテキストが必要になるでしょう。

答え2

私はsystem()がコマンドを実行していることを知っています。

正しい。

しばしばそれは「エコ、今はどうですか」です。

最後の文字がありません。

しかし、なぜ「/usr/bin/env」を前にする必要がありますか?

これはコマンドのフルパスenvではなく実行するコマンドですecho

それはまさにどんな役割を果たしますか?

echo関数が生成されたシェルで組み込み関数が実行されるのをsystem libc防ぐため、echoPATHで最初に見つかった実行可能ファイルが使用されます。echo動作は各実装によって異なる場合がありますが、ここでは特別な内容を見ることはできません。どちらの場合も、「What now?」を印刷する必要があります。運が悪い場合や、現在のディレクトリに「whatz」などの「what」で始まる5文字のファイルがある場合は除外されます。その場合、印刷内容は次のようになります。

今は何ですか?

関連情報