如何在zsh prexec函数中访问环境变量的当前值?

时间:2017-01-20 20:34:30

标签: zsh

我有一个简单的功能,如

function clearit() {
  REM=$(($LINENO % $LINES))
  DIV=$(($LINENO / $LINES))
  if [[ $DIV -gt 0 && $REM -lt 3 && $DIV ]]; then
    clear
  fi
  echo $LINENO, $LINES
}
add-zsh-hook preexec clearit

在上面的函数中,$ LINE和$ LINES的静态值被添加到prehook函数中。我想在执行prexec时获取当前值。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

对于普通的shell变量,获取当前值:

% x=1
% function test_hook() { echo $x; }
% add-zsh-hook preexec test_hook
% true
1
% x=2
1
% true
2

但是,$LINENO是一个非常特殊的变量。来自文档:

  

LINENO< S>

     

当前脚本,源文件或正在执行的shell函数中当前行的行号,以最近开始的为准。请注意,在shell函数的情况下,行号是指原始定义中出现的函数,不一定是内置函数所显示的函数。

执行钩子函数时,根据定义,它是最近启动的shell函数,脚本或源文件。因此$LINENO始终为您提供钩子函数中的当前行。无法访问外部范围的$LINENO

但是,即使您可以访问钩子中的外部$LINENO,我认为这会导致非常奇怪的行为。假设你的终端是30行高($LINES是30),它会在执行第30,31和32命令之前清除终端,然后在接下来的27个命令中清空,然后在第60,第61和第60之前再次清除62,依此类推。我不认为这是你想要实现的远程......