要解答这个看似简单的问题,需要先复习一下Linux系统里“命令”这个词的含义。
Linux系统中的命令有两种:一是内置命令,是Shell与生俱来的一部分,比如最基础的cd、echo、kill等;二是外部命令,包含已编译的实用程序以及Shell脚本两种,它们两者又可以统称为可执行文件(executables)。我们平时常用的大多数看起来像“内置(自带)命令”的命令,其实都是/usr/bin及其他目录下的已编译程序,如ls、ps、grep等。
可见,外部命令的实体并不存在于Shell中,而是在调用时才从对应的位置加载。如果用户调用命令时没有提供路径的话,Shell通过PATH环境变量来定位外部命令的路径。
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/java/jdk1.8.0_172/bin:/usr/java/jdk1.8.0_172/jre/bin
如果在PATH给定的路径仍然找不到命令,Shell就会返回"command not found"。这也就解释了为什么在Linux下安装完JDK之后,总是要将$JAVA_HOME/bin写入PATH——用户肯定不想每次调用JDK提供的命令时都要先cd到JDK的安装路径,或者把路径写得清清楚楚。
按照上文所述,我们平时自己写的Shell脚本也是外部命令。下面在/tmp/test目录下直接创建一个文件:touch my_script.sh,并在其中写几句简单的话。
#!/bin/sh
echo "Hello World!"
echo "Parameter 1 is: $1"
echo "M