shell 是否有类似钩子的系统?

wil*_*yes 4 shell zsh

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

钩,在我看来,基本上是“做一些事情发生后”,其中的事件,可能是与参数,如任何命令git clonegit submodule addcdrm或任何其他。

我想说,“如果git add,做git status”。例如,我总是:git add X; git status,和cd X; ls -la,我可以想到更多这样的组合,我想在我的工作流程中自动化。

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

  1. 我不认为它可以主要原因容易做的是,我有多种功能的定义,并没有找到一种方法来替代现有的功能,同时仍然能够使用它们。

我将用一个例子来说明我的意思:我使用了 Nathan Broadbent 的一些名为SCM Breeze 的zsh 脚本——这些脚本添加了一个 git() 函数来做事情。

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

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

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

如果有帮助,我将 ZSH 与 OhMyZsh 一起使用。

现在,我正在使用 bash 脚本(别名和函数)来做这件事,但感觉好像我在做的工作很可能现在已经由其他人完成了。任何有项目的人都会这样做吗?有助于以整洁的方式促进“钩子”?

Sté*_*las 6

可能对您有帮助的事情:

preexec被执行的每个命令行之前(不是每个命令之前)钩函数被调用。

preexec() echo will execute: $1
Run Code Online (Sandbox Code Playgroud)

precmd 在每个提示之前。

precmd() echo executed: $history[$[HISTCMD-1]]
Run Code Online (Sandbox Code Playgroud)

你可以像这样扩展一个函数:

functions[git]='
  (){ '$functions[git]'; } "$@"; local myret=$?
  do-extra-stuff
  return $myret'
Run Code Online (Sandbox Code Playgroud)

或者:

functions[git-old]=$functions[git]
git() {
  git-old "$@"
  local myret=$?
  do-extra-stuff || return $myret
}
Run Code Online (Sandbox Code Playgroud)

所述DEBUG捕集器在每个命令之后执行:

trap 'echo $ZSH_DEBUG_CMD returned with $?' DEBUG
Run Code Online (Sandbox Code Playgroud)

您可以重新定义accept-line小部件(映射到Enter)以在其中执行操作:

accept-line() {
  zle -R "going to run: $BUFFER"
  sleep 1
  zle .$WIDGET
}

zle -N accept-line
Run Code Online (Sandbox Code Playgroud)