
Linux 执行命令为什么要加 点斜杠
问题引入
按照官方文档安装helm ,执行helm version提示未找到命令

执行过程如下所示,在/usr/local/bin文件夹下有一个名为 helm 的二进制文件,但是在执行它的所在目录
执行时候却提示找不到文件,只有当前面加上 ./ 才可以正确的运行这个脚本。
[root@zepc-jh-nginx bin]# pwd
/usr/local/bin
[root@zepc-jh-nginx bin]# ls
helm
[root@zepc-jh-nginx bin]# helm version
-bash: helm: 未找到命令
[root@zepc-jh-nginx bin]# ./helm version
version.BuildInfo{Version:"v3.8.2", GitCommit:"6e3701edea09e5d55a8ca2aae03a68917630e91b",
GitTreeState:"clean", GoVersion:"go1.17.5"}
[root@zepc-jh-nginx local]# echo $PATH
/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/openssh/bin:/root/bin
原因分析
虽然我们的可执行文件是在当前目录,且当前目录中有我们要执行的文件,但是终端就是找不到它。需
要我们指定文件的相对或绝对路径来告诉终端我们想运行的文件在哪里。
在 Linux 中,点字符(.)表示工作目录,斜杠(/) 是 Linux 中的路径分隔符,我们用它来分离工作目录
(.)与文件名。
为什么我们需要 ./ ?因为我们的工作目录不包含在环境变量( $PATH )中。
如果在路径名中存在 ./ 字符,那么就不搜索 $PATH。
如果 ./ 不在路径名中,那么只在 $PATH 中搜索。
所以这就解释了为什么如果在 Hello.sh 前不加 ./ 就不能正常运行,原因就是在环境变量中没有名为
Hello.sh 的命令!
什么是环境变量
$PATH:决定了shell将到哪些目录中寻找命令或程序,$PATH的值是一系列目录,当你运行一个程序
时,Linux 在这些目录下进行搜索。
输入命令 echo $PATH 就可以查看当前的环境变量是多少。
在我的电脑上输出是(不同电脑输出可能不一样):
[root@zepc-jh-nginx local]# echo $PATH
/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/openssh/bin:/root/bin
我们在 Linux 上使用的命令都可以在这里面找到,例如ls 命令。但是如果我们想看命令具体的位置,可
以使用 which 命令。
终端中命令搜索规则
如果在路径名中存在 ./ 字符,那么就不搜索 $PATH。
如果 ./ 不在路径名中,那么只在 $PATH 中搜索。
把自己的命令添加进环境变量
如果自己写了几个命令,并且以后在运行的时候不想添加路径,那么可以把自己的命令所在路径添加进
环境变量。
比如我写了两个命令,分别是 my_ls.sh 和 Hello.sh,然后把他们放在了 ~/Desktop/myPATH 中。
在终端中输入:export PATH=$PATH:/home/zxy/Desktop/myPATH(这是一次临时的指定方法,关闭终
端之后就不再生效,这里只是演示效果,如果想了解更多,可以搜索“Linux 环境变量”)