Question

I am trying to get the number of columns and lines in my program. I am using the following code to do so:

...

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

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

...

The problem is that when I run this I get null for both. Running this with other environment variables, such as PATH or USER, works fine.

What I find strange is that running echo $COLUMNS and echo $LINES from the same shell both work fine.

Why is my program unable to get these two environment variables.

Was it helpful?

Solution

COLUMNS and LINES are set by the shell, but not exported, which means that they are not added to the environment of subsequently executed commands. (To verify that, examine the output of /usr/bin/env: it will show PATH and USER, but not COLUMNS and LINES.)

In the bash shell, you can call export VAR to mark a variable for export.

Alternatively, see Getting terminal width in C? for various ways to obtain the terminal width and height programmatically.

OTHER TIPS

If you don't see $LINES and $COLUMNS, they are probably not set. The xterm manual page states they may be set, depending on system configuration.

If you want to see what environment variables are passed to your program, use this little program (which uses the third, nonstandard "hidden" parameter to main() which should be available on all IXish systems:

#include <stdio.h>

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

If you want a portable way to obtain your terminal window size, its probably best to use ioctl(..., TIOCGWINSZ, ...)

Actually, COLUMNS and LINES are shell variable, but not environment variables.

You could use env to show the list of environment variables in current shell, and set to show the list of shell variables. And you will find that environment variables are a subset of shell variables.

The answers to this question is helpful:
differnce between the shell and environment variable in bash

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top