引数 $PATH を指定して execv を使用して echo を呼び出しています。出力は $PATH であり、bash で同じことを行ったときに得られる $PATH 環境変数の実際の値ではありません。
なぜこうなった?私はすべての正しい引数を渡しています..
execv("/bin/echo", ["echo","$PATH"]);
ありがとう。
bash
$PATH
オペレーティング システムではなく、 のような式を解釈して展開します。execv
プログラムが引数として受け取りたい文字列を、文字通り、引用符、エスケープ文字、シェル展開などなしで正確に渡します。
getenv
などの環境変数の値を調べるために使用しますPATH
。
Bash は、引数を に送信する前に、$PATH を環境変数 PATH の値に変更しますcat
。ただし、execv()
それは行わないため、 cat はリテラル文字列$PATH
を引数として受け取ります。PATH 環境変数を取得するには、「PATH」をgetenvに渡します。
あなたが書くとき
echo $PATH
シェルでは、環境変数 の展開を実行するのはシェル ( bash
、csh
、 、...) であり、実際にはを確認することはありませんが、コマンド ラインで展開された値を既に取得しています。1ksh
$PATH
echo
$PATH
C プログラムから環境変数の内容を取得したい場合は、以下を使用する必要がありますgetenv
。
const char *args[2]={"echo", getenv("PATH")};
execv("/bin/echo", args);
/bin/echo
が、組み込みのecho
命令を呼び出しますが、これはここでは関係ありません。C では、文字列リテラル"$PATH"
は 5 文字の文字列 (終端の を含めて 6 文字'\0'
) です。bash にあるように、環境変数への参照を拡張するメカニズムはありません。
環境変数の値を拡張したい場合は、標準getenv()
関数を使用できます: getenv("PATH")
.
$VAR
シェルによって認識される構文を認識する標準関数を知りません。