Archlinux 下提示未安装命令
[总点击:779次]用ubuntu的时候,如果你在命令行里输入一个未安装的命令,bash会给出很人性化的提示,让你先安装xxx软件包,比如:
程序 ‘xxx’ 尚未安装。 您可以通过输入以下命令安装:
sudo apt-get install xxx
通过e-file,再经过一点设置,在gentoo里面也可以达到类似的效果(参考骨头的文章:gentoo也可以提示未安装的命令)
这些都是通过重定义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 就可以了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #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 } |
现在查找速度终于快了哈,而且pacman更新同时就更新了pac-file的列表,再不用担心软件包的版本过期了^^
看看效果吧:
![]() |
| 发件人 xiooli |

不错,比我的效果好~我的是在线找的.
不过,怎么arch里没有 sl 呢?
母鸡呢,我突然想玩那个火车,结果发现末有:(
受教了。。。