0

「sh -c cmd」と「cmd」の違いは、シェルのコマンドラインから実行した場合と、ac exec() 関数から実行した場合のそれぞれですか? ありがとう。

4

2 に答える 2

3

' ' が何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は引用符が含まれていません。そのすべてが盲目的に明白です。)

于 2013-09-27T06:28:56.900 に答える
0

マニュアルページから:

-c string -c オプションが存在する場合、コマンドは string から読み取られます。文字列の後に引数がある場合、それらは $0 から始まる位置パラメータに割り当てられます。

bash cmd(またはデフォルトのシェル)を介して実行されます。-c 引数を明示的に呼び出すには sh が必要です。

exec はここで違いを生むべきではありません。

于 2013-09-27T06:17:08.513 に答える