zsh 和列

zsh 和列

$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

我很困惑

  1. 事实上,使用zsh=zsh会导致不同的结果;
  2. 事实上,在第一种情况下,设置COLUMNS=似乎等同于设置COLUMNS=0
  3. 事实上,在第二种情况下,设置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 (zshPATH/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

相关内容