getenv不适用于COLUMNS和LINES

时间:2014-03-23 07:42:12

标签: c environment-variables getenv

我正在尝试获取程序中的列数和行数。我使用以下代码来执行此操作:

...

char *cols = getenv("COLUMNS");
printf("cols: %s\n", cols);

char *lines = getenv("LINES");
printf("lines: %s\n", lines);

...

问题在于,当我运行它时,我得到两个都为空。使用其他环境变量(例如PATHUSER)运行此工作正常。

我觉得奇怪的是,从同一个shell运行echo $COLUMNSecho $LINES都可以正常工作。

为什么我的程序无法获取这两个环境变量。

3 个答案:

答案 0 :(得分:4)

shell将

COLUMNSLINES 设置,但不是导出,这意味着 它们不会添加到随后执行的命令的环境中。 (要验证这一点,请检查/usr/bin/env的输出:它会显示PATHUSER,但不显示COLUMNSLINES。)

在bash shell中,您可以调用export VAR来标记要导出的变量。

或者,请参阅Getting terminal width in C? 以各种方式以编程方式获得终端宽度和高度。

答案 1 :(得分:1)

如果您没有看到$LINES$COLUMNS,则可能未设置它们。 xterm手册页说明了可能的设置,具体取决于系统配置。

如果你想看看哪些环境变量传递给你的程序,请使用这个小程序(它使用main()的第三个非标准“隐藏”参数,该参数应该适用于所有IXish系统:

#include <stdio.h>

int main(int argc, char *argv[], char *envp[])
{
    while (*envp)
    {
        printf("%s\n", *envp++);
    }   
}

如果您想以便携方式获取终端窗口大小,最好使用ioctl(..., TIOCGWINSZ, ...)

答案 2 :(得分:0)

实际上,COLUMNSLINES是shell变量,但不是环境变量。

您可以使用env显示当前shell中的环境变量列表,使用set显示shell变量列表。你会发现环境变量是shell变量的一个子集。

这个问题的答案很有帮助:
differnce between the shell and environment variable in bash