Я могу
$ 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}