我有一个小脚本,它生成用于执行 flatpak 包的别名(以使 flatpak 以某种方式可以从命令行使用)。当我手动运行此命令时,一切正常。
但我不想在每次 flatpak 安装/更新/删除后总是手动执行此命令,而是希望每次调用 flatpak 命令后自动执行我的脚本。
因此,为了更有效地表达,我需要flatpak *
将命令重写为flatpak * && ~/my_script.sh
.
额外奖励:我如何限制此函数仅在调用脚本时调用脚本,flatpak install
而flatpak remove
不是在flatpak list
调用脚本时调用脚本?
有谁知道如何实现这一目标?
答案1
您可以创建一个alias
并将其添加到您的.bashrc
:
alias flatpak='flatpak_(){ flatpak "$@" && ~/my_script.sh; }; flatpak_'
my_script
仅当第一个参数是install
or时才执行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 等)(前提是您安排使该函数可访问)。请注意,该函数不会在脚本中定义:如果您希望在脚本中使用包装器,则需要在脚本顶部附近定义该函数,或者将包装器放在单独的脚本中,该脚本位于$PATH
where 的前面真实的flatpak
的是;看简单的包装脚本生成 100 个 bash 进程。
仅在某些命令之后运行脚本,并且像以前一样仅在成功时运行:
flatpak () {
command flatpak "$@" &&
case $1 in
install|remove) ~/my_script.sh;;
esac
}