「sh -c cmd」と「cmd」の違いは、シェルのコマンドラインから実行した場合と、ac exec() 関数から実行した場合のそれぞれですか? ありがとう。
2 に答える
' ' が何cmd
を表すかによって異なります。単純なコマンド名 (ps
または などls
) である基本的なケースでは、シェル コマンド ラインに違いはなく、execvp()
. 「非 p」exec*()
関数のセマンティクスはわずかに異なります。PATH 変数を使用しないため、コマンドが存在し、現在のディレクトリで実行可能である必要があります。そうでない場合、コマンドは失敗します。
ただし、cmd
より複雑な場合は、大きな違いが生じる可能性があります。例えば:
$ echo $$
17429
$ sh -c 'echo $$'
76322
$ sh -c "echo $$"
17429
$
1 つ目は、元のシェルのプロセス ID を報告します。2 番目は、シェル実行のプロセス ID を次のように報告しますsh
。3 つ目は、元のシェルのプロセス ID を報告するための高価な方法です。一重引用符と二重引用符も重要であることに注意してください。ここでは、引用符は C の呼び出しには存在せず (シェルは引数から引用符を削除します)、値は$$
子シェルの値になります。
char *argv[] = { "sh", "-c", "echo $$", 0 };
execvp(argv[0], argv);
(引用符は C の呼び出しには存在しないと言いました。C コードでは文字列の周りに引用符が必要ですが、渡される値にsh
は引用符が含まれていません。そのすべてが盲目的に明白です。)
マニュアルページから:
-c string -c オプションが存在する場合、コマンドは string から読み取られます。文字列の後に引数がある場合、それらは $0 から始まる位置パラメータに割り当てられます。
bash cmd
(またはデフォルトのシェル)を介して実行されます。-c 引数を明示的に呼び出すには sh が必要です。
exec はここで違いを生むべきではありません。