![一个棘手的递归 bash 别名?首次使用时安装](https://linux22.com/image/84792/%E4%B8%80%E4%B8%AA%E6%A3%98%E6%89%8B%E7%9A%84%E9%80%92%E5%BD%92%20bash%20%E5%88%AB%E5%90%8D%EF%BC%9F%E9%A6%96%E6%AC%A1%E4%BD%BF%E7%94%A8%E6%97%B6%E5%AE%89%E8%A3%85.png)
我想知道这是否可能,创建一个别名,如果该命令尚不存在,则执行 sudo apt-get 操作,然后实现别名以停止进行此更改。
因此我正在寻找这种语义
smartalias top =
if (not installed htop) then
install htop;
alias top htop;
top
答案1
您可以使用 shell 函数:
top() {
if ! type htop &>/dev/null; then
sudo apt-get install htop
fi
htop
}
答案2
Bash 有一个现有的功能可以解决这个问题:command_not_found_handle
。这是当 bash 尝试执行外部命令时执行的钩子。 Zsh 有command_not_found_handler
这是相似的。许多发行版都设置了 bash,以便在您尝试执行不存在的命令时它会提供安装相关包的功能。例如,您似乎使用的是 Debian 衍生版本,因此安装command-not-found
包裹。这种机制相当于为发行版提供的每个命令设置所需的别名。