shell有类似hook的系统吗?

shell有类似hook的系统吗?

我注意到我喜欢按特定顺序执行某些操作。

在我看来,钩子基本上是“在事件之后执行某些操作”,其中事件可以是带有参数的任何命令,例如git clonegit submodule addcdrm任何其他命令。

我想说,“如果git add,做git status”。例如,我总是:git add X; git status、 和cd X; ls -la,并且我可以想到更多类似的组合,我希望在我的工作流程中实现自动化。

别名\函数不能使用的原因有3个容易地在这里工作:

  1. 我认为不可能的主要原因容易地完成的是我有多个函数定义,并且还没有找到一种方法来覆盖现有函数,同时仍然能够使用它们。

我将用一个例子来说明我的意思:我使用 Nathan Broadbent 编写的一些 zsh 脚本,称为单片机微风- 脚本添加了一个执行操作的 git() 函数。

假设现在我想自动化我的工作流程,并使其在每个之后git clone都有一个cd由上一个命令创建的目录(下面是如何做到这一点)。为此,我将使用 git() 函数,对吗?

该函数将覆盖 SCM Breeze 命令,并且我将无法使用 SCM Breeze。

  1. 别名要求我记住一些事情。我希望这一切自动发生。
  2. 维护起来并不容易- 我尝试手动覆盖每个命令,但更改内容确实很麻烦,并且由于复杂性,我不认为自己会对我能想到的每个组合都执行此操作。

我将 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配置文件中,以便您每次登录时加载它们。

相关内容