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