getenv не работает для столбцов и строк

Я пытаюсь получить количество столбцов и строк в моей программе. Для этого я использую следующий код:

...

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

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

...

Проблема в том, что когда я запускаю это, я получаю null для обоих. Запуск этого с другими переменными среды, такими как PATH или USER, работает нормально.

Что мне кажется странным, так это то, что запуск echo $COLUMNS и echo $LINES из одной и той же оболочки работает нормально.

Почему моя программа не может получить эти две переменные среды.


person carloabelli    schedule 23.03.2014    source источник
comment
Вы пытались добавить определения в /etc/environment?   -  person Bartosz Marcinkowski    schedule 23.03.2014
comment
@BartoszMarcinkowski COLUMNS и LINES автоматически устанавливаются оболочкой (по крайней мере, bash).   -  person Lee Duhem    schedule 23.03.2014


Ответы (3)


COLUMNS и LINES устанавливаются оболочкой, но не экспортируются, что означает, что они не добавляются в среду последовательно выполняемых команд. (Чтобы убедиться в этом, проверьте вывод /usr/bin/env: он покажет PATH и USER, но не COLUMNS и LINES.)

В оболочке bash вы можете вызвать export VAR, чтобы пометить переменную для экспорта.

В качестве альтернативы см. Получение ширины терминала в C? для различных способов получения ширины терминала и высота программно.

person Martin R    schedule 23.03.2014
comment
Я пробовал предложение из первого ответа getenv(), так как оно оказалось проще. Второй способ сработал нормально. - person carloabelli; 23.03.2014

Если вы не видите $LINES и $COLUMNS, возможно, они не установлены. На странице руководства xterm указано, что они могут быть установлены в зависимости от конфигурации системы.

Если вы хотите увидеть, какие переменные среды передаются вашей программе, используйте эту маленькую программу (которая использует третий, нестандартный «скрытый» параметр для main(), который должен быть доступен во всех IXish системах:

#include <stdio.h>

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

Если вам нужен портативный способ получить размер окна терминала, вероятно, лучше всего использовать ioctl(..., TIOCGWINSZ, ...)

person mfro    schedule 23.03.2014

На самом деле COLUMNS и LINES являются переменными оболочки, а не переменными среды.

Вы можете использовать env, чтобы отобразить список переменных среды в текущей оболочке, и set, чтобы отобразить список переменных оболочки. И вы обнаружите, что переменные среды являются подмножеством переменных оболочки.

Ответы на этот вопрос полезны:
разница между оболочка и переменная окружения в bash

person Lee Duhem    schedule 23.03.2014