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