显示环境变量LD_LIBRARY_PATH

问题描述:

我有简单的控制台应用程序,它打印环境变量:显示环境变量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

根据运行脚本的方式,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

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

它无关,与你的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++测试,它的工作原理