之间有什么细微的区别吗:
file
和
./file
作为相对路径?
答案1
当在 shell 或exec*p()
libc 函数中用作命令名称时,file
将查找file
($PATH
或对于 shell,可能调用内置版本,或按该名称调用函数),同时./file
将运行当前目录。
这并不是./
触发特殊行为,只是如果命令名称不包含任何/
,它就会进行$PATH
查找。./cmd
是给出cmd
包含/
.
该./
前缀还常用于确保文件名不会以某些命令有问题的字符开头。
例如:
rm ./-f
删除-f
, whilerm -f
会rm
使用该-f
选项进行调用(rm -- -f
也可以)。或者:
cat ./-
awk '{print $1}' ./a==b.txt
哪里--
没有帮助。
您发现 asrm ./*
或awk ... ./*
在脚本中,您不知道 的扩展是否*
会产生有问题的字符。
答案2
是的。一些。
C 库函数
正如另一个答案中提到的,exec*p()
库函数系列使用名称是否包含斜杠字符来测试是否应该执行路径搜索。
进一步阅读
其他搜索路径的东西
程序当然可以在 C 库之外进行自己的路径搜索。他们可能正在寻找其他东西而不是执行他们。或者他们可能想要与 C 库函数略有不同的行为,这对于那些不知道 POSIX 标准要求的人来说有一些鲜为人知的惊喜。所以他们实现了自己的搜索代码。通常它们会遵循 C 库的约定,如果名称包含斜杠字符,它们将按原样使用名称。
例如:
具有CDPATH
或cdpath
机制执行此类搜索并具有此行为的外壳。这是 TENEX C shell:
〜>设置cdpath =(/ usr /) 〜> cd ./等 ./etc: 没有这样的文件或目录。 〜> CD等 /ETC /etc>
以减号开头的文件名
确保以减号开头的文件名不被视为命令行选项的方法之一是在其前面加上./
.举些例子:
rm ./-rf
是文件名,rm -rf
是命令行选项。find ./-name wibble
正在扫描两个目录树并找到所有内容;而find -name wibble
正在扫描一个目录树并应用模式匹配。
进一步阅读
命令语法使得这一点变得很重要的命令
有时,命令的语法被定义为如果某个内容以句号开头,那么它根本就只是一个文件名。否则就是别的东西了。在某种程度上,这是减号作为选项字符约定的概括。
例如:
与丹·伯恩斯坦的multilog
来自 daemontools,Bruce Guenter 的multilog
来自 daemontools-encore,djbwaresmultilog
和洛朗·贝尔科特的s6-log
从 s6 开始,命令行参数是记录脚本其中每个参数的第一个字母指示它是什么类型的脚本命令。为了表示日志目录,必须给出一个以斜杠或句号字符开头的命令字符串参数。 multilog ./t ./u
表示登录到两个目录;而multilog t ./u
意味着记录到一个目录并添加时间戳。
答案3
file
PATH
将在您的文件中搜索该文件。
./file
将忽略PATH
并在当前目录中搜索。