0

最後に次のコードを持つ C プログラムがあります。

    memcpy(buff,"TEST=",4)
    putenv(buff)
    system("/bin/bash")

新しい環境変数を新しいシェルに入れました。私は簡単にできるテキストファイルにテストをエコーし​​たいと思っています。次に、シェルを終了して再度実行したいので、これを実行すると次のようになります

   ./cprog "some arg"
   echo $TEST > test.txt
   exit
   ./cprog "some arg"
   echo $TEST > test.txt
   exit

TEST 変数を変更できるように、終了し続ける必要があります。シェルスクリプトでこれを機能させるにはどうすればよいので、cプログラムをループして実行し続けることができるので、引数を変更できますが、シェルスクリプト自体を終了することはありません。

4

2 に答える 2

2

環境変数は、プロセスからユーザーまたは呼び出しプロセスに情報を渡す適切な方法ではありません。この情報を stdout に書き込み (その他の情報は stderr に)、適切にリダイレクトする必要があります。

ただし、このソリューションを主張する場合は、使用できます

for p in "one arg" "another arg" "more"
do 
    echo 'printf "%s\n" "$TEST" >> test.txt' | ./cprog "$p"
done

これにより、変数をファイルに書き込むコマンドがプログラムに入力され、シェルが終了します (入力が終了するため)。

最後に、$TEST連結されたすべての値がファイルに含まれますtest.txt

于 2013-09-11T20:57:28.983 に答える
1

プログラムが親プロセスの環境を変更することはできません。これは、あなたがやろうとしているようです。

ただし、代わりにできることは、プログラムに目的の出力を単純に出力させ、 を使用して呼び出すことevalです。

$ ./cprog "wibble"
TEST=wibble
$ eval `./cprog "wibble"`
$ echo ""TEST\" is now equal to \"$TEST\""
"TEST" is now equal to "wibble"
$
于 2013-09-11T20:48:44.517 に答える