2017-12-27 414 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 然後仔細檢查與命令:

export |grep LD_LIBRARY_PATH 

得到輸出:

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

但仍然沒有看到我的PROGRAMM LD_LIBRARY_PATH

回答

3

根據運行腳本的方式,env變量只會添加到運行腳本的子shell的環境中。

如果你像這樣運行腳本:

$ ./script.sh 

這將產生一個新的shell其中腳本運行。父shell,即您啓動腳本的那個,不會受腳本的影響。因此對環境所做的更改將不可見(更改工作目錄或類似內容也不起作用)。

如果腳本意欲修改當前外殼的環境中,腳本需要使用.source命令來採購:

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

help source在bash:

執行命令來自當前shell中的文件。

再就是似乎是代碼的一個問題:

作爲一個評論者指出previousy,也有成功的案例printf很多的感嘆號。我認爲這些是爲了強調找到的變量名稱。由於它們不在格式字符串的開頭引號之內,因此它們被解釋爲邏輯運算符而不是運算符。

結果是格式字符串文字(指針)被否定,導致false由於操作符的數量。這通常映射爲0,這意味着格式字符串變爲空指針。將空指針交給printf時會發生什麼,因爲格式字符串依據我所知道的實現而定。如果它沒有崩潰,那麼肯定不會打印任何東西。

因此,代碼可能實際上工作,但由於該錯誤沒有可見的輸出。要修復它,請將感嘆號移入格式字符串中,即在開始引號之後。

+0

照建議,但仍然沒有看到我的應用程序LD_LIBRARY_PATH。 UPD中的更多詳細信息請見正文。 – vico

+0

我已經更新了我的答案,在您的成功案例printf中包含有關有問題的感嘆號的部分。 – mmlr

0

printf(!!!!!!!"%s\n", thisEnv); 更改爲printf("!!!! %s\n", thisEnv);

0

它無關,與你的C/C++應用程序就行了。 嘗試以下操作: $ ./script.sh $回聲$ LD_LIBRARY_PATH ,你會看到那個LD_LIBRARY_PATH沒有設置

當您啓動腳本時,bash創建與環境的新工藝從原來的繼承bash過程。在新創建的進程中,您設置了進程環境變量LD_LIBRARY_PATH = xxxx 最終確定後,script.sh退出,其環境隨之死亡。

含義LD_LIBRARY_PATH未在您的原始shell中設置。

如上所述,您需要在當前shell中運行腳本 要麼使用。或與來源。

我與你的C/C++測試,它的工作原理