这两个命令有什么区别?
. filename # (A)
和
filename # (B)
这个命令如何相关?
./filename # (C)
注意:#和其后的行是注释.
命令(A)被称为源包含shell命令的文件.它可能不用于二进制可执行文件(有关如何确定文件类型的信息,请参阅man文件).它会导致文件中的命令在当前环境中执行,就像在shell提示符下键入它们一样.结果会影响当前环境,因此可以执行诸如设置环境变量的值和更改目录,添加函数定义等操作.没有必要使用chmod设置执行位.该文件需要位于当前目录中,或者必须包含完整或相对路径*,或者文件可以位于PATH环境变量中的位置(取决于是否设置了shopt的sourcepath选项).如果该文件所在的位置,则无需指定当前目录.这些都是等价的:
$ls filename $. filename results $ls /some/directory/filename /some/directory/filename $. /some/directory/filename results $cd /elsewhere $echo $PATH /some/directory $. filename results
命令(B)仅在执行位为用户权限时才会执行该文件(请参阅man chmod).该文件可以是shell脚本,二进制可执行文件或其他脚本,如Perl或Python(或在不同的shell中编写).如果名称中没有斜杠(未指定目录),则该文件必须位于PATH环境变量中包含的目录中.可以在路径中包含当前目录,但我不推荐它,因为它存在安全风险.这些是等价的:
$echo $PATH /some/directory $filename results $/some/directory/filename results
命令(C)与命令(B)基本相同,但它指定了当前目录,称为“.”. (正如父目录被称为“..”.由于指定了目录,因此不会搜索PATH以找到该文件.
[*]相对路径是不以斜杠(/)开头的路径.它指定相对于当前目录的位置. “this / is / a / subdir”作为当前目录路径存在,与“./this/is/a/subdir”(指定同一目录)一样. “../another/set/of/dirs”是当前父目录下面的一组目录.