Zsh 使用preexec()对输入的命令求值

Zsh 使用preexec()对输入的命令求值,zsh,Zsh,我想在运行某些命令之前使用preexec()修改它们,但我需要能够计算当前输入的命令。在执行整个命令之前,是否存在包含该命令的变量?我知道是最后一个命令,但在保存到历史记录之前,我需要当前行 举个我想做的例子可能会有所帮助 ls-l/root请 然后我想让preexec看到我在结尾写了“请”,并用 sudo ls-l/root 我想大概 preexec() { if [[ $CURRENT_LINE =~ bitch$ ]]; then $CURRENT_LINE=&qu

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

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

ls-l/root请

然后我想让preexec看到我在结尾写了“请”,并用

sudo ls-l/root

我想大概

preexec() {
    if [[ $CURRENT_LINE =~ bitch$ ]]; then
        $CURRENT_LINE="sudo ${CURRENT_LINE% please}"
    fi
可以工作,但我在zsh中找不到一个变量,该变量为我提供了正确的$CURRENT\u行

对于奖励积分,我还希望能够自己在一行中输入
,并让它运行
sudo但我可能可以用某种形式的别名来实现这一点


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

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

尽管要执行的实际命令作为
$1
$2
$3
传递

preexec

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

--

例如:

alias ls='ls-sF--color=auto'
preexec(){

print“>>>preexecI喜欢更改accept line小部件的想法,但在将函数定义添加到我的zshrc时遇到了问题。当我添加它时,它会显示
预期条件:“$BUFFER”"
我四处搜索,但什么也没看到。有什么想法吗?我怀疑是
=~
操作符导致了错误,所以我已经更新以避免使用它。我希望这可以修复错误。好吧,我想知道zsh使用
echo$zsh_version
的版本。我希望你能修改
接受行
小部件。只要一个nit点击:你正在寻找的模式应该与你正在删除的文本相匹配。因此,你可能应该使用
*“please”
,而不仅仅是
*please
,因为如果最后一个单词刚好以bitch结尾,后一个模式也会匹配(尽管不太可能,至少在使用英语单词时是如此…)@Adaephon,好消息!我已经按照你的建议进行了更新。非常感谢你的评论。谢谢各位,这完全符合我的预期。如果仍然有用,我的zsh版本在我的笔记本电脑上是5.0.5,在我的桌面上是4.9.11。我还没有在我的桌面上尝试过,但下周可以
% 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
...