这两个命令有什么区别?
- . 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”是当前父目录下面的一组目录.