$COLUMNS
我无法理解下变量的行为zsh
。这是我所指的这种行为的一个例子。脚本$HOME/cols.sh
如下:
echo "COLUMNS=$COLUMNS"
set | grep -a COLUMNS
COLUMNS=
echo "COLUMNS=$COLUMNS"
set | grep -a COLUMNS
根据我是否使用env -i zsh
或运行此脚本,我会得到不同的结果env -i =zsh
:
% env -i zsh -flc '. ~/cols.sh'
COLUMNS=80
COLUMNS=80
COLUMNS=0
COLUMNS=0
% env -i =zsh -flc '. ~/cols.sh'
COLUMNS=80
COLUMNS=80
COLUMNS=80
COLUMNS=80
我很困惑
- 事实上,使用
zsh
和=zsh
会导致不同的结果; - 事实上,在第一种情况下,设置
COLUMNS=
似乎等同于设置COLUMNS=0
; - 事实上,在第二种情况下,设置
COLUMNS=
似乎没有任何效果;
这些文档没有对这些问题给出太多说明:
COLUMNS <S>
The number of columns for this terminal session. Used for printing select lists and
for the line editor.
FWIW,
% which zsh
/usr/local/bin/zsh
% echo =zsh
/usr/local/bin/zsh
% =zsh --version
zsh 5.0.2 (x86_64-apple-darwin11.4.2)
答案1
正如 Stéphane Chazelas 在评论中所解释的那样,zsh
并=zsh
给出不同的结果,因为您在不同的目录中有两个 zsh 版本。对于env -i zsh
,会在未设置的情况下env
查找,因此它只查找and (zsh
PATH
/usr/bin
/bin
后备路径) 并执行/usr/bin/zsh
.其中,正在执行命令env -i =zsh
的 zsh 实例env
扩大=zsh
到当前搜索路径的完整路径( 的当前值PATH
),即/usr/local/bin/zsh
。
行为上的差异来自于提交 9af1cd47229041fda4dc07f0ef70691a64d49908,更具体地说补丁30533,它是在 zsh 5.0.0 发布之前发布的。 (我通过搜索COLUMNS
提交历史记录找到了该提交,并通过实验确认了该提交会产生影响。)
COLUMNS
是一个“神奇”变量,始终更新为当前终端宽度。在 zsh 4.x 之前的版本中,设置COLUMNS
尝试调整终端大小,但这从未正常工作,并且在 zsh 5.0.0 中删除了相关代码。因此,在现代版本的 zsh 中,COLUMNS
交互式 shell 中的设置没有任何效果:它会立即更新回终端宽度。在旧版本中,设置一个非数字值(例如空字符串)与将变量设置为 0 具有相同的效果,因为该值必须是整数。
答案2
这就是正在发生的事情。
首先,正如您所知,COLUMNS 是一个告诉终端屏幕宽度的变量。有时 shell 会为您设置它,因此设置它COLUMNS=
可以让 shell 将值更新为它检测到的终端中的实际列数。
其次,此命令运行 zsh 并处理脚本:
env -i zsh -flc '. ~/cols.sh'
第三,这个命令运行一个不同的 shell(我相信要么是执行它的同一个 shell,要么是 $SHELL 的值),然后处理它;几乎=zsh
被忽略了:
env -i =zsh -flc '. ~/cols.sh'
实际上,这使得它看起来=zsh
可能实际上有效果,但我看不出这有什么用,因为我不相信任何 shell 支持“空”环境变量名称:
env -i =zsh env
输出为=zsh
,这意味着有一个未将名称设置为 的变量zsh
。