bash指令没反应(bash命令用法)

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来提醒命令需要安装的包

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

bash指令没反应(bash命令用法讲述)

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

bash指令没反应(bash命令用法讲述)

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

bash指令没反应(bash命令用法讲述)

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

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

bash指令没反应(bash命令用法讲述)

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

bash指令没反应(bash命令用法讲述)

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

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

bash指令没反应(bash命令用法讲述)

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

bash指令没反应(bash命令用法讲述)

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

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

0xff 总结

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)

相关推荐