首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setenv和getenv文档

setenv和getenv文档
EN

Stack Overflow用户
提问于 2015-06-11 05:08:32
回答 1查看 9.1K关注 0票数 0

我知道,对于应该在堆栈溢出上发布的内容来说,这是一个有点离题的话题,但我想知道这些示例是否做得很好。

setenv:

手册页- setenv

包括: #include <stdlib.h>

声明: int setenv(const char *v_name, const char *v_value, int overwrite);

返回:如果成功返回零,则返回-1,并将errno设置为指示错误的原因。

getenv:

手册页- getenv

包括: #include <stdlib.h>

declaration: char *getenv(const char *name)

返回:如果成功返回指向环境中值的指针,则返回;如果没有匹配,则返回NULL。

示例

在以下示例中,char *ppath用作变量。

示例1:这个示例显示了当overwrite参数为非零且v_name有一个值时会发生什么。

代码语言:javascript
复制
ppath = getenv("PWD");                  //puts the environment of $PWD into ppath
if(ppath == NULL)                       //error checking
  perror("getenv");   
cout << "$PWD = " << ppath << endl;     //prints the environment of $PWD 

此代码的输出为$PWD = /class/classes/username/CS100,这是因为char变量ppathgetenv("PWD")获取环境,而$PWD的环境是/class/classes/username/CS100。因此,ppath指向该环境。还有正确的错误检查,以确保$PWD具有一个环境,如果没有,则调用perror

代码语言:javascript
复制
ppath = getenv("HOME");                 //gets the environment of the $HOME
if(ppath == NULL)                       //error checking
  perror("getenv");
cout << "$HOME = " << ppath << endl;    //prints the environment of $PWD

此代码的输出为$HOME = /class/classes/username,这是因为char变量ppathgetenv("HOME")获取环境,而$HOME的环境是/class/classes/username。因此,ppath指向该环境。还有正确的错误检查,以确保$HOME具有一个环境,如果没有,则调用perror

代码语言:javascript
复制
if(-1==setenv("PWD",ppath,1))           //since the overwrite parameter is non-zero it replaces environment 
  perror("setenv");                     //of $PWD with the value of ppath which is defined by the environment 
                                        //of $HOME

这是为了改变$PWD的环境,在这种情况下,它采用ppath所指向的值,在本例中是/class/classes/username,也是$HOMEoverwrite参数是非零的,因此它将$PWD的环境替换为ppath

代码语言:javascript
复制
ppath = getenv("PWD");                  //gets the environment of $PWD
if(ppath == NULL)                       //error checking
  perror("getenv");
cout << "$PWD = " << ppath << endl;     //the value should now be the same as the value of $HOME

此代码的输出为$PWD = /class/classes/username,这是因为char变量ppathgetenv("PWD")获取环境,而$PWD的环境是/class/classes/username。因此,ppath指向该环境。还有正确的错误检查,以确保$PWD具有一个环境,如果没有,则调用perror。示例1的完整输出如下。

产出1:

代码语言:javascript
复制
$PWD = /class/classes/username/CS100
$HOME = /class/classes/username
$PWD = /class/classes/username

示例2:这个例子显示了当overwrite参数为非零且v_name有一个空值时会发生什么,就像在v_name = ""中,所以是空字符串。

代码语言:javascript
复制
ppath = getenv("PWD");                  
if(ppath == NULL)
  perror("getenv");
cout << "$PWD = " << ppath  << endl;    //in this case ppath ="" because the environment of $PWD is not set

以下代码的输出将是$PWD = --这是因为$PWD的环境被设置为"" --在本例中,它使ppath指向一个空字符串。因此,它不抛出错误的原因是,如果$PWD是一个未定义的变量,则调用perror

代码语言:javascript
复制
ppath = getenv("HOME"); 
if(ppath == NULL)
  perror("getenv");
cout << "$HOME = " << ppath << endl;

输出:这个代码是$HOME = /class/classes/username,这是因为char变量ppathgetenv("HOME")获取环境,$HOME的环境是/class/classes/username。因此,ppath指向该环境。还有正确的错误检查,以确保$HOME具有一个环境,如果没有,则调用perror

代码语言:javascript
复制
if(-1==setenv("PWD",ppath,1))           //since the overwrite parameter is non-zero it replaces environment 
  perror("setenv");                     //of $PWD with the value of ppath which is defined by the environment 
                                        //of $HOME 

由于overwrite参数为1,所以与前面示例中定义的$PWD设置为ppath无关。

代码语言:javascript
复制
ppath = getenv("PWD");                  
if(ppath == NULL)
  perror("getenv");  
cout << "$PWD = " << ppath << endl;     //the value should now be the same as the value of $HOME

以下代码的输出为$PWD = /class/classes/username --这是因为setenv将过去代码块中定义的$PWD值更改为ppath

产出2:

代码语言:javascript
复制
$PWD =
$HOME = /class/classes/username
$PWD = /class/classes/username

示例3:这个示例显示了当overwrite参数为零而v_name有一个值时会发生什么。

代码语言:javascript
复制
ppath = getenv("PWD"); 
if(ppath == NULL)
  perror("getenv");
cout << "$PWD = " << ppath << endl;

在本例中,ppath设置为$PWD环境。此代码块的输出为$PWD = /class/classes/username/CS100

代码语言:javascript
复制
ppath = getenv("HOME"); 
if(ppath == NULL)
  perror("getenv");
cout << "$HOME = " << ppath << endl;

在此代码块中,ppath设置为$HOME环境。以下代码块的输出将是$HOME = /class/classes/username

代码语言:javascript
复制
if(-1==setenv("PWD",ppath,0))           //since the overwrite parameter is zero it does not replaces  
  perror("setenv");                     //environment of $PWD with ppath.

这里有一个新的情况,即overwrite参数为零。在这种情况下,什么是ppath并不重要,因为零标志使得$PWD不会被ppath替换,除非$PWD是一个未定义的变量,在这种情况下,$PWD将被赋予ppath的值。

代码语言:javascript
复制
ppath = getenv("PWD");                
if(ppath == NULL)
  perror("getenv");
cout << "$PWD = " << ppath << endl;     //the value should not be changed.

此代码块的输出为$PWD = /class/classes/username/CS100。这是因为setenv没有因为overwrite参数而改变$PWD的环境。

产出3:

代码语言:javascript
复制
$PWD = /class/classes/username/CS100
$HOME = /class/classes/username
$PWD = /class/classes/username/CS100

示例4:这个示例显示了当overwrite参数为零或非零且v_name是环境中未定义的参数时会发生什么。

代码语言:javascript
复制
ppath = getenv("HOME"); 
if(ppath == NULL)
  perror("getenv");
cout << "$HOME = " << ppath << endl;

在这种情况下,给出了$HOME的环境,并进行了适当的错误检查。代码块的输出是$HOME = /class/classes/username

代码语言:javascript
复制
if(-1==setenv("random_name",ppath,0))   //since the overwrite parameter is zero and the variable     
perror("setenv");                       //$random_name is undefined, setenv makes the environment of 
                                        //$random_variable is the value of ppath. If the case where
                                        //there is a undefined variable the setenv behaves the
                                        //same way regardless of a non-zero or zero overwrites parameter. 

在这种情况下,overwrite参数仍然是零,但是没有声明v_name,所以在这里,零的overwrite参数是有用的。在本例中,random_name被设置为ppath,它指向$HOME的环境,即/class/classes/username

代码语言:javascript
复制
ppath = getenv("random_name");                  //gets the value of $PWD
if(ppath == NULL)
  perror("getenv");
cout << "$random_name = " << ppath << endl;     //the value should now be the same as the value of $HOME

ppath包含$random_name的环境,该环境由setenv在前一个代码块中设置。此代码块的输出为$random_name = /class/classes/username

产出4:

代码语言:javascript
复制
$HOME = /class/classes/username
$random_name = /class/classes/username
EN

回答 1

Stack Overflow用户

发布于 2015-06-11 06:30:26

您正在使用C++;您可以在编写时轻松地声明变量。实际上,C99和C11都允许您在使用变量时声明它们。

示例1

示例1:这个示例显示了当覆盖参数为非零且v_name有一个值时会发生什么。

实际上,很难在示例1中发现与overwrite参数有任何关系的代码。

ppath = getenv("PWD");//将$PWD的环境放入ppath ( ppath == NULL) //错误检查perror("getenv");cout << "$PWD =“<< ppath << endl;//打印$PWD环境。

当您确定ppath为NULL时,不应该使用它;这是一个普遍的问题。现在,既然这是nullptr,你不应该使用C++吗?我认为这可能是:

代码语言:javascript
复制
const char *ppath = getenv("PWD");
if (ppath == nullptr)
    perror("getenv");   
else
    cout << "$PWD = " << ppath << endl;

如果您说编码是为了向后兼容性,那么使用NULL或0代替nullptr没有什么大问题。

实际上,您有三次几乎相同的代码块;您需要编写一个函数:

代码语言:javascript
复制
void show_env(const char *varname)
{
    const char *ppath = getenv(varname);
    if (ppath == nullptr)
        perror("getenv");   
    else
        cout << "$" << varname << " = " << ppath << endl;
}

这是对原始代码的直接音译。它还说明了为什么perror()是一个糟糕的函数;很难使错误消息有意义(它不包括变量名)。此外,getenv()的POSIX规范没有指定errno是由getenv()设置的,我们应该将代码修改为:

代码语言:javascript
复制
void show_env(const char *varname)
{
    const char *ppath = getenv(varname);
    if (ppath == nullptr)
        cerr << "No value in the environment for $" << varname << endl;   
    else
        cout << "$" << varname << " = " << ppath << endl;
}

然后你可以打电话给:

代码语言:javascript
复制
show_env("PWD");
show_env("HOME");
…code using setenv()…
show_env("PWD");

等。我不相信引用$HOME的代码是相关的;您实际上没有使用它。

就我个人而言,我非常不喜欢你在setenv()代码中使用的背对头比较风格。当尤达想说…的时候

请注意,仅设置环境变量$PWD并不会更改当前工作目录。

示例2

示例2没有清楚地显示将v_name设置为空字符串。但是,这是setenv()的POSIX规范所涵盖的情况。这一次定义了一个错误(errno将被设置为EINVAL)。

重复的代码太多了,很难发现什么是有趣的。

示例3

你说:

示例3:这个示例显示了当overwrite参数为零而v_name有一个值时会发生什么。

我想你是说:

示例3:这个示例显示了当overwrite参数为零且由v_name标识的环境变量有一个值时会发生什么。

这可能以前也适用。

例4

你说:

ppath = getenv("random_name");//获取$PWD的值

注释与代码不匹配。

风格化

您应该为每个示例创建一个以###作为行前缀的标题。您可能有也可能没有一个超级标题## Examples。您可以模仿函数大纲的手册页面的样式,也可以简单地省略除概要之外的所有内容,这是指函数行为定义的位置。

正如所写的,很难找到这4个例子(在回答的过程中,我才意识到有四个例子,而不是三个)。你有很多重复。您也有大量的噪声(引用$HOME的代码基本上是噪声。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30772027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档