我注意到我喜欢按特定顺序执行某些操作。
在我看来,钩子基本上是“在事件之后执行某些操作”,其中事件可以是带有参数的任何命令,例如git clone
、git submodule add
、cd
或rm
任何其他命令。
我想说,“如果git add
,做git status
”。例如,我总是:git add X; git status
、 和cd X; ls -la
,并且我可以想到更多类似的组合,我希望在我的工作流程中实现自动化。
别名\函数不能使用的原因有3个容易地在这里工作:
- 这我认为不可能的主要原因容易地完成的是我有多个函数定义,并且还没有找到一种方法来覆盖现有函数,同时仍然能够使用它们。
我将用一个例子来说明我的意思:我使用 Nathan Broadbent 编写的一些 zsh 脚本,称为单片机微风- 脚本添加了一个执行操作的 git() 函数。
假设现在我想自动化我的工作流程,并使其在每个之后git clone
都有一个cd
由上一个命令创建的目录(下面是如何做到这一点)。为此,我将使用 git() 函数,对吗?
该函数将覆盖 SCM Breeze 命令,并且我将无法使用 SCM Breeze。
- 别名要求我记住一些事情。我希望这一切自动发生。
- 维护起来并不容易- 我尝试手动覆盖每个命令,但更改内容确实很麻烦,并且由于复杂性,我不认为自己会对我能想到的每个组合都执行此操作。
我将 ZSH 与 OhMyZsh 一起使用,如果有帮助的话。
现在,我正在使用 bash 脚本(别名和函数)来做这件事,但感觉好像我现在正在做的工作很可能是由其他人完成的。有人熟悉这样做的项目吗?帮助以整洁的方式促进“挂钩”?
答案1
可能对您有帮助的事情:
钩子preexec
函数在每个命令行执行之前调用(不是每个命令之前)。
preexec() echo will execute: $1
precmd
在每个提示之前。
precmd() echo executed: $history[$[HISTCMD-1]]
您可以像这样扩展函数:
functions[git]='
(){ '$functions[git]'; } "$@"; local myret=$?
do-extra-stuff
return $myret'
或者:
functions[git-old]=$functions[git]
git() {
git-old "$@"
local myret=$?
do-extra-stuff || return $myret
}
该DEBUG
陷阱在每个命令后执行:
trap 'echo $ZSH_DEBUG_CMD returned with $?' DEBUG
您可以重新定义accept-line
小部件(映射到Enter)以在其中执行操作:
accept-line() {
zle -R "going to run: $BUFFER"
sleep 1
zle .$WIDGET
}
zle -N accept-line
答案2
据我所知,没有任何设施的行为方式与您所描述的类似。但是,可以在 Bash 中创建别名或函数来实现您想要的功能,这听起来与您所描述的类似
例子
作为函数
$ function mygadd() { git add "$@"; }
$ function mcd() { cd "@"; ls -la; }
作为别名
$ alias mycmd='cmd1; cmd2;'
笔记:使用别名,您无法传递位置参数。您可以通过将参数包含在对别名的调用中来伪传递参数,然后别名将由 shell 扩展为单个命令行。
例子
$ alias somecmd='ls -la'
$ somecmd dir1 dir2
上面的代码将被调用,ls -la dir1 dir2
但是这两个参数从未传递给别名,而是别名被扩展为ls -la dir1 dir2
在评估和执行命令行时。
两者都可以合并到您的$HOME/.bashrc
配置文件中,以便您每次登录时加载它们。