Почему $ COLUMNS не отображается ни в env, ни в наборе? (по zsh)

Я могу

$ echo $COLUMNS 95 

и получить результат, но если я

 env | grep COLUMNS 

или

 set | grep COLUMNS 

Я ничего не получаю.

(Обновление: я только что обнаружил, что поведение отличается от bash. Я использую zsh.)

Во-вторых, как / где я могу получить список, включающий COLUMNS. (Не включая только эхо его прямо).

Если бы я догадался, я бы заподозрил IFS . set списки IFS тоже. И для меня IFS – это (пробел, горизонтальная вкладка, новая линия и нуль):

 $ printf "%s" "$IFS" | od -a 0000000 sp ht nl nul 0000004 

Наличие символа NUL ( \0 ) приводит к тому, что grep обрабатывает его как двоичный файл, поэтому в зависимости от вашего grep вы можете увидеть:

 $ set | grep COLUMNS Binary file (standard input) matches 

Вы можете заставить grep обрабатывать ввод как текст:

 -a, --text Process a binary file as if it were text; this is equivalent to the --binary-files=text option. 

И так:

 $ set | grep COLUMNS --text COLUMNS=239 

set | grep COLUMNS set | grep COLUMNS должен отображать «Бинарный файл (стандартный ввод)» (с GNU grep). muru правильно определил виновника: под zsh IFS содержит нулевой байт в дополнение к пробелу стандартных символов, tab, новой строке.

Run set | grep --text COLUMNS set | grep --text COLUMNS чтобы grep игнорировал его склонность пропускать двоичные файлы.

Запуск set не является переносимым, надежным способом перечисления параметров, заданных в текущий момент, поскольку его вывод неоднозначен во многих оболочках (вы не можете отличить новую строку, которая является частью значения переменной из новой строки, разделяющей переменные). Вывод set в zsh происходит, чтобы быть однозначным, но его трудно разобрать: grep все равно может возвращать ложные срабатывания. Чтобы перечислить все параметры в zsh, перечислите ключи массива parameters :

 print -rl ${(ko)parameters}