为什么在“-bash: XX: command not found”下常用命令如“cat”,“ls”变得不可用?

先看这个信息

“-bash: XX: command not found”

直译过来就是bash找不到相应的命令
前文里我们提到这个问题是由于"PATH"设置出错
导致我们输入这些常用命令如"ls","cat","vim"等
我们之前解决这个问题的方法是

'键入"export PATH=/usr/bin:/usr/sbin:/bin:/sbin"'

那么关键信息就是这个名为"PATH"的变量
首先我们在初始化的系统(阿里云自带的centos)下键入
"echo $PATH"

为什么在“-bash: XX: command not found”下常用命令如“cat”,“ls”变得不可用?

出现了以下结果

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

我们根据给出的路径进行查找

/usr/local/sbin

为什么在“-bash: XX: command not found”下常用命令如“cat”,“ls”变得不可用?

什么也没

/usr/local/bin

为什么在“-bash: XX: command not found”下常用命令如“cat”,“ls”变得不可用?

还是什么都没

/usr/bin以及最后的 /bin

为什么在“-bash: XX: command not found”下常用命令如“cat”,“ls”变得不可用?

刷的一下,满满的绿色,有意思的是这两个文件夹显示完全内容一样,有兴趣的可以用“pwd”和"mkdir"试试

我们来 “find” 一下

为什么在“-bash: XX: command not found”下常用命令如“cat”,“ls”变得不可用?

果不其然,我们常用的命令都在这里
不过我们之前用来解决问题的"export"看起来并不在这里,这一点我们之后再谈

现在我们找到了放置常用命令 "ls","vim"等的放置地
下一步我们来找一下为什么"PATH"设置错误后所有的"/bin"路径下的命令都变成不可用的了

首先我们要知道这几个文件

/etc/profile
$HOME/.bash_profile
$HOME/.bashrc

其中 /etc/profile文件是系统上默认的bash shell的主启动文件,系统上的每个用户登录时都会执行这个启动文件
让我们打开它看看

为什么在“-bash: XX: command not found”下常用命令如“cat”,“ls”变得不可用?

我们需要看的是它的头和尾

头部

为什么在“-bash: XX: command not found”下常用命令如“cat”,“ls”变得不可用?

头部"pathmunge"函数的作用:判断当前系统的PATH中是否有该命令的目录,如果没有,则判断是要将该目录放于PATH之前还是之后。
什么情况下没有呢?我们可以看看这里的case语句:
根据冒号分割的参数“$1”是的话则通过否则判断“$2”的参数,是的话通过,不是的话将“$1”代表的参数放至末尾。

尾部

为什么在“-bash: XX: command not found”下常用命令如“cat”,“ls”变得不可用?

尾部使用for语句来迭代/etc/profile.d目录下的所有文件。这为Linux系统提供了一个放置特定应用程序启动文件的地方。
当用户登录时,shell会执行这些文件。我们可以去看看。

为什么在“-bash: XX: command not found”下常用命令如“cat”,“ls”变得不可用?

现在让我们回到一开始的问题,

为什么在“-bash: XX: command not found”下常用命令如“cat”,“ls”变得不可用?

答:因为用来查询命令的“PATH”环境变量设置出错(多半是格式出错导致的路径覆盖)
导致Linux系统执行/etc/profile文件中的"pathmunge"函数找不到对应的路径。
于是放置于原先路径下的常用命令就变得不可用了。

PS
/usr 软件放置处 与我们常用的软件有关
/root(/,根目录) 开机系统相关
/bin 放置一些系统必备脚本

case语句会检查每个参数是不是有效选项。是的话就执行对应case语句中的命令。
不管选项按什么顺序出现在命令行上,这种方法都适用。

上一篇:php内核分析(五)-zval


下一篇:SHELL脚本也要函数化