-2

引数 $PATH を指定して execv を使用して echo を呼び出しています。出力は $PATH であり、bash で同じことを行ったときに得られる $PATH 環境変数の実際の値ではありません。

なぜこうなった?私はすべての正しい引数を渡しています..

execv("/bin/echo", ["echo","$PATH"]);

ありがとう。

4

4 に答える 4

1

bash$PATHオペレーティング システムではなく、 のような式を解釈して展開します。execvプログラムが引数として受け取りたい文字列を、文字通り、引用符、エスケープ文字、シェル展開などなしで正確に渡します。

getenvなどの環境変数の値を調べるために使用しますPATH

于 2013-10-31T15:25:17.247 に答える
1

Bash は、引数を に送信する前に、$PATH を環境変数 PATH の値に変更しますcat。ただし、execv()それは行わないため、 cat はリテラル文字列$PATHを引数として受け取ります。PATH 環境変数を取得するには、「PATH」をgetenvに渡します。

于 2013-10-31T15:24:45.150 に答える
1

あなたが書くとき

echo $PATH

シェルでは、環境変数 の展開を実行するのはシェル ( bashcsh、 、...) であり、実際にはを確認することはありませんが、コマンド ラインで展開された値を既に取得しています。1ksh$PATHecho$PATH

C プログラムから環境変数の内容を取得したい場合は、以下を使用する必要がありますgetenv

const char *args[2]={"echo", getenv("PATH")};
execv("/bin/echo", args);

  1. 実際、通常、シェルは を呼び出しません/bin/echoが、組み込みのecho命令を呼び出しますが、これはここでは関係ありません。
于 2013-10-31T15:25:12.013 に答える
0

C では、文字列リテラル"$PATH"は 5 文字の文字列 (終端の を含めて 6 文字'\0') です。bash にあるように、環境変数への参照を拡張するメカニズムはありません。

環境変数の値を拡張したい場合は、標準getenv()関数を使用できます: getenv("PATH").

$VARシェルによって認識される構文を認識する標準関数を知りません。

于 2013-10-31T15:26:38.547 に答える