http://joolix.com/2009/07/archlinux-com ... nd_handle/
用ubuntu的时候,如果你在命令行里输入一个未安装的命令,bash会给出很人性化的提示,让你先安装xxx软件包,比如:
程序 ‘xxx’ 尚未安装。 您可以通过输入以下命令安装:
sudo apt-get install xxx
通过e-file,再经过一点设置,在gentoo里面也可以达到类似的效果(参考骨头的文章:gentoo也可以提示未安装的命令:http://li2z.cn/2009/07/02/command_not_found_handle/)
这些都是通过重定义bash的command_not_found_handle函数来实现的,archlinux上也有一些方案,比如通过 pacman -Si/pacman -Ss 来搜索的,前者只能找软件包而不能提示具体的命令,后者要通过网络实时查找。还有通过一个叫做pac-file(类似gentoo中的e-file)来找,这个命令可以从效果上完美实现这个功能,但是如果程序列表比较大或者机器慢的话,那么查找起来可能就是硬盘飞奔,CPU狂飙,而且过了一段时间后还得自己手动更新软件列表。这几种方案均不是很完美,于是俺只好自己动手,丰衣足食了,思路如下:
1) 在用pacman -Sy的时候自动更新pac-file的软件列表
2) 将所有的可执行命令项放到另一个文件里面,到时候去这里查找(因为pac-file的列表包含了软件包的所有文件项,故查找起来很慢,而我们要提示的是命令,也就是可执行文件,所以可以缩小搜索范围)
好,开工,代码如下,只需将其写到~/.bashrc里面再运行一下 . ~/.bashrc 就可以了:
代码: 全选
#pacman 简写,pacman更新同时更新pac-file并产生只含有可执行文件项的软件包列表。
pm () {
if [ "`which powerpill 2>/dev/null`" ]; then
sudo powerpill $@
else
sudo pacman $@
fi
arg="`sed 's/ //g;s/-//g' <<< $@`"
[ "$arg" -a "$arg" != "${arg//Sy}" ] && {
sudo pac-file -S
[ -d $HOME/.Share/ ] || mkdir -p $HOME/.Share/
pac-file bin/[^\/]+$ > $HOME/.Share/cmd.list && echo "cmd.list 已更新!"
}
}
#命令未找到时的处理,从cmd.list里面去查找软件包
command_not_found_handle() {
echo "-bash: $1: 命令未找到"
if [ "`grep bin/$1$ $HOME/.Share/cmd.list`" ]; then
echo "下列软件包含有命令 $1 :"
grep bin/$1$ $HOME/.Share/cmd.list
else
echo "未搜索到含有命令 $1 的软件包 :("
fi
}
看看效果吧: