-bash: go: command not found_bash中的command_not_found_handle

0x00 bash中的command_not_found_handle是什么

command_not_found_handle是bash工作在login模式下的一个功能,对我们输入的一个命令,bash从PATH里面也没有搜索到这个命令的时候,bash会看一个function command_not_found_handle 是否定义了,如果没有定义这个function,那么bash直接报错找不到这个命令. 如果定义了这个函数,那么会执行这个函数,带的参数是输入在bash里面的命令及其参数.

在ubuntu和fedora中,bash默认定义了这个函数的,在rhel和centos中,这个函数没有定义.我们看下ubuntu中是怎样使用这个函数的.

0x01 Ubuntu中使用command_not_found_handle来提醒命令需要安装的包

在定义了这个函数的情况下

5d53f04cdd3a48c1a4f71f9fd954e8b3

可以看到,当执行一个不存在的命令时,一共用了19秒bash才输出了这个命令不存在

886ab2a24f3a4c58a7a511635653dbb2

使用unset将这个函数删除,再执行一个不存在的命令,发现bash马上就返回命令不存在了.

2b641f7947ae4416a61cd61da701d8da

那么这个函数在定义的时候到底干了什么事情呢?其实ubuntu中使用这个函数来提醒不存在的命令需要安装什么包

比如现在我的机器上面没有安装tree命令,我敲tree的时候,大概用了3s,bash提醒我需要安装tree这个包.

58dde2f4f01f49409458b28315e808ca

看了上面type command_not_found_handle的函数定义,可以知道用的是/usr/lib/command-not-found这个命令来进行搜索.我们可以手动触发一下,可以看到和bash输出是一样的.

e6e40d9d5319484fbc7afa3569090fdf

0x02 通过卸载command-not-found禁用该功能

通过使用dpkg -S /usr/lib/command-not-found,我们可以知道这个命令是command-not-found这个包提供的.

8cf3abb4a4214b7d9a5f1af2f49dc253

实际上,这个命令本身是用python3实现的,其核心逻辑就是查询/usr/share/command-not-found/commands.db这个sqlite3数据库,库里面记录了每个命令所在包的信息.如果那个命令在这个库里面有匹配,那么很快就能返回,并告知需要安装的包,如果没有匹配,相当于查完了整个数据库,所以需要挺久的时间才会返回命令没有找到.

82a1490da16a4d39920be400074e97b3

对于桌面版系统,这个功能还是很有用的,毕竟有时候命令的名字和包的名字会差很多.需要自己去google才能知道命令需要安装什么包才可以.但是对于服务器版本,这个功能会导致一条命令下去半天没有反应,让人觉得是不是系统出问题了,而且服务器上也不会让随便安装包.

所以不要这个功能的话,直接apt remove command-not-found卸载这个包即可.

0xff 总结

bash中的command_not_found_handle提供了一个执行命令不存在时进行命令查找的功能,一般桌面版本使用了这个功能来提升可用性,而服务器版本为了稳定性没有使用这个功能.其实我们也可以自己定义这个函数来实现更加"魔幻"的功能. 比如所有不存在的命令都输出一段特殊的文字之类的.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值