qgetenv返回NULL

时间:2013-08-19 23:50:38

标签: linux qt ubuntu

我需要在linux(UBUNTU)中获取环境变量的值。为此,我使用“qgetenv”函数和环境变量名称。我可以确认设置了环境变量的值,因为当我回显$ VARIABLE_NAME时,它完全打印了变量的值。我正在使用的代码片段:

  QByteArray root  = qgetenv("PAPARAZZI_HOME");
  if (root.data()==NULL) {
    cerr << "PAPARAZZI_HOME is not defined" << endl;
    exit(0);
  }
  string pprzRoot = string(root.data());

和echo $ PAPARAZZI_HOME打印以下字符串:
“/家庭/马尼什/ paprazzi-混帐/狗仔队/”。
我正在使用
sudo "Path to Application Dir"/"Application Name".

调用我的程序

答案:“sudo”删除了大部分用户的环境变量。因此,如果想要保留环境变量以及sudo,则必须使用sudo -E。有关详细信息,请参阅“man sudo”。

1 个答案:

答案 0 :(得分:1)

具有

$ echo $PAPARAZZI_HOME

打印期望值不会验证$PAPARAZZI_HOME是否为环境变量。它可能是一个未导出的shell变量。

如果您在shell提示符处输入以下内容进行设置:

$ PAPARAZZI_HOME=/home/manish/paprazzi-git/paparazzi/

那么它不是环境变量。试试这个:

$ export PAPARAZZI_HOME=/home/manish/paprazzi-git/paparazzi/

再次运行您的程序。或者,如果您已经为其分配了值:

$ export PAPARAZZI_HOME

某些较旧的shell(如原始sh)不支持在一个命令中设置和导出变量。如果您正在使用这样的shell,则需要使用两个命令来设置环境变量:

$ PAPARAZZI_HOME=/home/manish/paprazzi-git/paparazzi/
$ export PAPARAZZI_HOME

如果您使用的是csh或tcsh,则语法不同。设置(非环境)shell变量:

% set PAPARAZZI_HOME = /home/manish/paprazzi-git/paparazzi/

设置环境变量:

% setenv PAPARAZZI_HOME /home/manish/paprazzi-git/paparazzi/

在csh和tcsh中,shell变量和环境变量并没有像sh,ksh,bash,zsh等那样紧密相关;没有直接的方法(比如export命令)将现有的shell变量更改为环境变量。并且您可以拥有一个shell变量和一个具有相同名称的环境变量,在这种情况下$PAPARAZZI_HOME将扩展为shell变量的值。如果你正在使用bash,你可以放心地忽略这一段。

另一种可能性是,您的程序正在以不继承shell环境的方式启动。如果从IDE或其他GUI启动程序,它将不会继承您在shell中设置的环境变量 - 除非您从该shell启动了IDE或GUI,并且在设置之后环境变量。由于您使用的是Ubuntu,请尝试在shell提示符下输入完整路径来启动应用程序。

哦,你可能不需要跟踪/

**更新:**

在聊天中进行了长时间的讨论之后,事实证明OP正在使用sudo调用他的程序,因为它需要root权限。

默认情况下,

sudo会删除大多数环境变量。

您可以使用sudo -E要求它保护您的环境。 man sudo了解详情。

目前尚不清楚sudo -E是否是最佳解决方案;它可能有安全隐患。

如果程序只需要一个环境变量,那么:

$ sudo env PAPARAZZI_HOME = / home / manish / paprazzi-git / paparazzi / path / to / the / program