执行特定命令后如何执行命令/脚本?

执行特定命令后如何执行命令/脚本?

我有一个小脚本,它生成用于执行 flatpak 包的别名(以使 flatpak 以某种方式可以从命令行使用)。当我手动运行此命令时,一切正常。

但我不想在每次 flatpak 安装/更新/删除后总是手动执行此命令,而是希望每次调用 flatpak 命令后自动执行我的脚本。

因此,为了更有效地表达,我需要flatpak *将命令重写为flatpak * && ~/my_script.sh.

额外奖励:我如何限制此函数仅在调用脚本时调用脚本,flatpak installflatpak remove不是在flatpak list调用脚本时调用脚本?

有谁知道如何实现这一目标?

答案1

您可以创建一个alias并将其添加到您的.bashrc

alias flatpak='flatpak_(){ flatpak "$@" && ~/my_script.sh; }; flatpak_'

my_script仅当第一个参数是installor时才执行remove

alias flatpak='flatpak_(){ flatpak "$@" && [[ "$1" = install || "$1" = remove ]] && ~/my_script.sh; }; flatpak_'

答案2

在您的中定义一个包装函数.zshrc

flatpak () {
  command flatpak "$@" && ~/my_script.sh
}

内置命令command告诉 shell 调用名为flatpak(在 中找到$PATH)的外部命令,而不是递归地调用该函数。"$@"被传递给 的参数列表替换flatpak

这适用于所有类似 sh 的 shell(dash、bash、ksh、zsh 等)(前提是您安排使该函数可访问)。请注意,该函数不会在脚本中定义:如果您希望在脚本中使用包装器,则需要在脚本顶部附近定义该函数,或者将包装器放在单独的脚本中,该脚本位于$PATHwhere 的前面真实的flatpak的是;看简单的包装脚本生成 100 个 bash 进程

仅在某些命令之后运行脚本,并且像以前一样仅在成功时运行:

flatpak () {
  command flatpak "$@" &&
  case $1 in
    install|remove) ~/my_script.sh;;
  esac
}

相关内容