使用preexec()来评估输入的命令

时间:2015-01-22 22:40:01

标签: zsh

我想使用preexec()在运行之前修改某些命令,但我需要能够评估当前输入的命令。在执行之前是否有包含整个命令的变量?我知道!!是最后一个命令,但在将其保存到历史记录之前我需要当前行。

我想做的一个例子可能会有所帮助

ls -l /root bitch

然后我想让preexec看到我在最后写了婊子并用

替换它

sudo ls -l /root

我认为像

preexec() {
    if [[ $CURRENT_LINE =~ bitch$ ]]; then
        $CURRENT_LINE="sudo ${CURRENT_LINE% bitch}"
    fi

会工作但我无法在zsh中找到一个给我正确$ CURRENT_LINE的变量

对于奖励积分,我也希望能够在一行上输入bitch并使其运行sudo !!但我可能会使用某种形式的别名。

我认为制作一个bitch函数可能会更好,我可以管理一个命令,但我不认为它也可以运行,因为命令会运行并失败(之前在用sudo再次运行之前。管道)。

1 个答案:

答案 0 :(得分:4)

据我所知,preexec不适合修改要执行的命令。我们无法更改要从preexec函数内部执行的命令...

虽然要执行的实际命令是$1$2$3

  

preexec

     

在读取命令后即将执行并执行。如果历史记录机制处于活动状态(并且未从历史缓冲区中删除该行),则用户键入的字符串将作为第一个参数传递,否则它将为空字符串。将要执行的实际命令(包括扩展别名)以两种不同的形式传递:第二个参数是命令的单行大小限制版本(函数体之类的东西被省略);第三个参数包含正在执行的全文。

     

- zshmisc(1) 9.3.1 Hook Functions

例如:

alias ls='ls -sF --color=auto'
preexec () { 
  print ">>>preexec<<<"
  print -l ${(qqq)@}
}

如果我在~/.zshrc以上,那么我会得到以下内容:

% echo test preexec<Esc-Return>
ls<Return>
;# outputs below
>>>preexec<<<
"echo test preexec
ls"
"echo test preexec; ls -sF --color=auto"
"echo test preexec
ls -sF --color=auto"
test preexec
total 1692
...

您可以将自己的zle小部件函数添加到zsh行编辑器以操作行编辑器缓冲区。 (zshzle(1)

您可以添加zle小部件功能来更改按 Enter 的行为。

my-accept-line () {
  if [[ "$BUFFER" == *" bitch" ]]; then
    BUFFER="sudo ${BUFFER% bitch}"
  fi
  zle .accept-line
}
zle -N accept-line my-accept-line

上述代码段将accept-line的功能从内置行为更改为此处定义的my-accept-line


添加缩写也有帮助,如下所述:

  

克隆vim的缩写功能

     

- “examples:zleiab [ZshWiki]” - http://zshwiki.org/home/examples/zleiab