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

Use preexec() to evaluate entered command

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

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

ls -l /root please

然后我希望 preexec 看到我在最后写了“请”并将其替换为

sudo ls -l /root

我觉得像

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

可以,但我在 zsh 中找不到给我正确 $CURRENT_LINE

的变量

对于奖励积分,我还希望能够单独在一行中输入 please 并拥有它 运行 sudo !! 但我可能可以使用某种形式的别名来做到这一点.

我认为制作一个 please 函数可能会更好,我可以通过管道将命令传递给它,但我认为这不会起作用,因为该命令将 运行 并失败(在管道之前)在使用 sudo 再次 运行 之前。

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

尽管要执行的实际命令作为 </code>、<code></code> 传递。</p> <blockquote> <p>preexec</p> <p>Executed just after a command has been read and is about to be executed. If the history mechanism is active (and the line was not discarded from the history buffer), the string that the user typed is passed as the first argument, otherwise it is an empty string. The actual command that will be executed (including expanded aliases) is passed in two different forms: the second argument is a single-line, size-limited version of the command (with things like function bodies elided); the third argument contains the full text that is being executed.</p> <p>-- <a href="http://zsh.sourceforge.net/Doc/Release/Functions.html#index-preexec_005ffunctions" rel="noreferrer"><code>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" == *" please" ]]; then
    BUFFER="sudo ${BUFFER% please}"
  fi
  zle .accept-line
}
zle -N accept-line my-accept-line

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


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

Cloning vim's abbreviation feature

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