显示环境变量LD_LIBRARY_PATH

时间:2017-12-27 14:54:30

标签: c++ linux eclipse

我有简单的控制台应用程序来打印环境变量:

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

3 个答案:

答案 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 ++进行了测试,它可以正常工作