为什么 $COLUMNS 没有按 env 或 set 列出? (在 zsh 上)

为什么 $COLUMNS 没有按 env 或 set 列出? (在 zsh 上)

我可以

$ echo $COLUMNS
95

并得到结果,但如果我

env | grep COLUMNS

或者

set | grep COLUMNS

我什么也没得到。

(更新:我刚刚发现 bash 上的行为有所不同。我正在使用 zsh。)

其次,我如何/在哪里可以获得包含列的列表。 (不包括直接回应它。)

答案1

set | grep COLUMNS应显示“二进制文件(标准输入)匹配”(使用 GNU grep)。穆鲁已经正确找出罪魁祸首:在zsh下,IFS除了标准字符空格、制表符、换行符之外还包含空字节。

运行set | grep --text COLUMNS以使 grep 忽略其跳过二进制文件的倾向。

运行set不是一种列出当前设置的参数的可移植、可靠的方法,因为它的输出在许多 shell 中都是模棱两可的(您无法区分变量值的一部分换行符和分隔变量的换行符)。zshset中的输出恰好被引用,以便明确无误,但很难解析:grep仍然可能返回误报。要列出 zsh 中的所有参数,请枚举数组的键parameters

print -rl ${(ko)parameters}

答案2

如果让我猜,我会怀疑IFS。也set列出了IFS。对我来说,IFS是(空格、水平制表符、换行符和 nul):

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

\0NUL 字符 ( )的存在会导致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

相关内容