Running Linux, Chapter 4, Section 10
4.10 命令究竟是什么?
我们前面说到,Unix提供了大量的命令,并允许用户添加更多。这和其他操作系统完全不同,那些系统一般都有一张严格的命令表。那么,Unix命令究竟是什么?它们是怎么存储的?在Unix中,一个命令就是一个简单的文件。例如,ls这个命令就是目录bin中的一个二进制文件。所以,除了直接使用ls,你也可以输入完整的路径,也称为绝对路径:
$ /bin/ls
这个机制使得Unix非常的灵活和强大。要提供新的功能,系统管理员只要把它安装到默认存放命令的目录中。一个命令的不同版本也可以共存,比如说,可以把一个功能的新版本放在一个地方用于测试,同时在另一个地方保留它的旧版本,用户可以选择自己需要的使用。
这里有一个常见的问题:有时你输入了一个希望在系统中找到的命令,但是只得到了一个“找不到命令”的提示信息。这个问题可能是由于你的shell没有找到存放命令的目录。Shell寻找命令的目录的列表称为path(用户路径)。输入下面的指令可以看到你的用户路径是什么(不要漏掉$符号,否则你看不到系统变量的内容,只能看到它的名字,切记!)
$ echo $PATH
/usr/local/bin:/usr/bin:/usr/X11R6/bin:/bin:/usr/lib/java/bin:\ /usr/games:/usr/bin/TeX:.
这里有一点需要注意。输出信息是一串用冒号分隔开的路径名称。对当前用户,第一个路径名称是/usr/local/bin。第二个是/usr/bin,等等。所以如果一个命令存在两个版本,一个在/usr/local/bin中,另一个在/usr/bin中,将会执行/usr/local/bin中的那个。最后一个路径名称是点(.),它代表当前路径。不同于Windows命令行的解释器,Unix不会自动的在你的当前目录中查找命令。你必须直接告诉Unix,就像这里显示的。一些人出于安全方面的考虑,认为在当前目录查找是个坏主意。(一个进入你账户的入侵者可能在你的某个工作目录中防止恶意程序。)不过,这往往是针对root用户的,所以普通用户不需要太担心。
如果没有找到命令,你必须指明它在系统的什么位置,并把这个目录添加到你的系统路径中。查阅手册可以知道命令的位置。假设命令在/usr/sbin目录,这个目录安装了很多管理命令。你知道需要访问这些系统命令,于是你输入下面的命令(注意第一个PATH没有$符,第二个有):
$ export PATH=$PATH:/usr/sbin
这个命令添加了/usr/sbin目录,但是把它做为查找时的最后一个目录。这个命令的意思是:“把我的用户路径改为旧的路径加上/usr/sbin。”
前面这段代码只在部分shell中工作正常。它在使用类似Bourne Shell的Shell(如bash)的Linux中工作良好。但如果你使用csh或tcsh,你必须使用下面的命令代替:
set path = ( $PATH /usr/sbin )
最后,还有些不以文件型式存在的命令,比如cd。这类命令大多数影响shell本身并由shell执行。因为它们本身就是shell的一部分,所以称为内部命令。
================================
PS:翻译了一小段练手的
