2017-12-27 21 views
0

私は環境変数を出力する簡単なコンソールアプリケーションがあります。実行実行する前に表示環境変数LD_LIBRARY_PATH

int main(int argc, char **argv, char **envp) 
{ 

    printf("Scanning for LD_LIB_PATH\n"); 
    for (char **env = envp; *env != 0; env++) 
    { 
    char *thisEnv = *env; 
    std::string s= *env; 
    if (s.find("LD_LIBRARY_PATH")!=std::string::npos) 
     { 
     printf("!!!!!!! %s\n", thisEnv); 
     } 

    printf("%s\n", thisEnv); 
    } 

} 

を私はLD_LIBRARY_PATH

export LD_LIBRARY_PATH=~/aaa/bbb/Debug:~/ccc/ddd/Debug 
echo "searching:" 
export | grep LD_LIBRARY 
echo "done" 

スクリプトを設定するスクリプトを実行して出力して正常に動作:

exporting 
searching: 
declare -x LD_LIBRARY_PATH="/home/vicp/aaa/bbb/Debug:/home/vico/ccc/ddd/Debug" 
done 

私は実行可能ファイルを実行し、多くの変数を検出しますが、環境はありませんt変数LD_LIB_PATH。どうして?コマンドで

UPD

その後 . ./script.sh推奨Iスクリプトとしてダブルチェック:

export |grep LD_LIBRARY_PATH 

ガット出力:

declare -x LD_LIBRARY_PATH="/home/vicp/aaa/bbb/Debug:/home/vico/ccc/ddd/Debug" 

しかし、まだ、私のプログラムの開発にLD_LIBRARY_PATHが表示されません。

答えて

3

スクリプトの実行方法によっては、env変数はスクリプトを実行しているサブシェルの環境にのみ追加されます。

あなたは、このようなスクリプトを実行する場合:

$ ./script.sh 

これは、スクリプトが実行されている新しいシェルを起動します。親シェル、つまりスクリプトを開始したシェルは、スクリプトの動作の影響を受けません。したがって、環境への変更は表示されません(作業ディレクトリの変更なども機能しません)。

スクリプトは現在のシェルの環境を変更しようとする場合、スクリプトは.またはsourceコマンドを使用して調達する必要があります

$ . ./script.sh 
$ source ./script.sh 

bashでhelp sourceから:

実行現在のシェル内のファイルからのコマンド。

そして、コードに問題があるように思われる:

コメンターがpreviousyを述べたように、感嘆符の多くは、成功事例printfにあります。私は、これらの変数名が見つかったと推測しています。それらは書式文字列の開始引用符の外側にあるため、論理NOT演算子として解釈されます。

結果として、書式文字列リテラル(ポインタ)がネゲートされ、演算子の数のためにfalseになります。これは通常0にマップされます。これは、フォーマット文字列がNULLポインタになることを意味します。フォーマット文字列としてprintfへのヌルポインタを渡すとどうなりますか?クラッシュしない場合は、何も印刷されません。

コードは実際には動作しますが、そのバグのために目に見える出力はありません。これを修正するには、感嘆符をフォーマット文字列に移動します。 printf("!!!! %s\n", thisEnv);

+0

の作品は推奨されているようでしたが、それでも自分のアプリケーションからのLD_LIBRARY_PATHが表示されません。問題のUPDの詳細を参照してください。 – vico

+0

あなたの成功事例printfに問題のある感嘆符についてのセクションを含めるように私の答えを更新しました。 – mmlr

0

ルックは、それはあなたのC/C++アプリケーションとは何の関係もありません。 次試してください。 $ ./script.sh $エコーの$ LD_LIBRARY_PATH をそして、あなたは、あなたのスクリプトを起動すると、そのLD_LIBRARY_PATHが

に設定されていない参照してくださいよ、bashは元から継承されたその環境と新しいプロセスを作成bashプロセス。新しく作成されたプロセスでは、プロセス環境変数LD_LIBRARY_PATH = xxxxを設定します。 終了時にscript.shが終了し、その環境が終了します。

元のシェルにはLD_LIBRARY_PATHが設定されていません。

上記のように、現在のシェルでスクリプトを実行する必要があります。 どちらかとしてください。またはソースを使用します。

私はあなたのC/C++でテストし、それが

0

にラインprintf(!!!!!!!"%s\n", thisEnv); 変更で