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
コマンドがあります。シェル組み込みコマンドと外部コマンドの動作に違いがある可能性があります。実際、echo
2 つの点でコマンド間に違いがあります。最初の引数が次に始まるとどうなるか-
(一部のecho
バージョンでは複数のオプションを処理する)バックスラッシュを処理する方法(一部のバージョンでは文字通り印刷し、他のバージョンではエスケープ文字として扱う)。したがって、echo
これらの実装依存の動作を使用したい場合は、強制バージョンが役に立ちます。ほとんどの場合、使用する方が良いですprintf
。アンティークを除いて、持ち運び可能で持ち運びできるprintf
すべての機能を実行します。echo
サンプルコードに渡されたパラメータを使用すると、エコー実装の選択は重要ではありません。この狂気の理由があれば、それを見つけるためにもう少しコンテキストが必要になるでしょう。
答え2
私はsystem()がコマンドを実行していることを知っています。
正しい。
しばしばそれは「エコ、今はどうですか」です。
最後の文字がありません。
しかし、なぜ「/usr/bin/env」を前にする必要がありますか?
これはコマンドのフルパスenv
ではなく実行するコマンドですecho
。
それはまさにどんな役割を果たしますか?
echo
関数が生成されたシェルで組み込み関数が実行されるのをsystem
libc
防ぐため、echo
PATHで最初に見つかった実行可能ファイルが使用されます。echo
動作は各実装によって異なる場合がありますが、ここでは特別な内容を見ることはできません。どちらの場合も、「What now?」を印刷する必要があります。運が悪い場合や、現在のディレクトリに「whatz」などの「what」で始まる5文字のファイルがある場合は除外されます。その場合、印刷内容は次のようになります。
今は何ですか?