我有简单的控制台应用程序来打印环境变量:
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
我运行可执行文件,它找到许多变量,但没有环境变量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"
但我的程序中仍然没有看到LD_LIBRARY_PATH
。
答案 0 :(得分:3)
根据您运行脚本的方式,env变量只会添加到运行脚本的子shell的环境中。
如果你运行这样的脚本:
$ ./script.sh
这将生成一个运行脚本的新shell。父shell(即从中启动脚本的shell)不会受脚本的影响。因此,不会看到对环境的更改(更改工作目录或类似工具也不起作用)。
如果脚本旨在修改当前shell的环境,则需要使用.
或source
命令获取脚本:
$ . ./script.sh
$ source ./script.sh
来自bash中的help source
:
从当前shell中的文件执行命令。
然后代码似乎有问题:
正如评论者所述,在成功案例printf
中有很多惊叹号。我认为这些是为了突出显示找到的变量名称。由于它们位于格式字符串的开头引号之外,因此它们被解释为逻辑非运算符。
结果是格式字符串文字(指针)被否定,由于运算符的数量而导致false
。这通常映射到0,这意味着格式字符串变为空指针。将空指针传递给printf
时会发生什么,因为格式字符串取决于我所知道的实现。如果它没有崩溃,那么肯定不会打印任何东西。
因此代码可能实际工作,但由于该错误没有可见的输出。要修复它,请将感叹号移动到格式字符串中,即在打开引号之后。
答案 1 :(得分:0)
查看第printf(!!!!!!!"%s\n", thisEnv);
行
更改为printf("!!!! %s\n", thisEnv);
答案 2 :(得分:0)
它与您的C / C ++应用程序无关。 尝试以下方法: $ ./script.sh $ echo $ LD_LIBRARY_PATH 并且您将看到LD_LIBRARY_PATH未设置
当您启动脚本时,bash会创建一个新进程,其环境继承自原始bash进程。在新创建的进程中,设置进程环境变量LD_LIBRARY_PATH = xxxx 完成后,您的script.sh退出,其环境随之消失。
表示原始shell中未设置LD_LIBRARY_PATH。
如上所述,您需要在当前shell中运行脚本 要么。或与来源。
我用你的C / C ++进行了测试,它可以正常工作