“文件”和“ ./文件”路径之间有什么区别吗?


Answers:


14

我对SmallLoanOf1M的解释并不感到疯狂。从技术上讲这是正确的,但答案与问题中的用法示例不匹配。

因此,通过示例的方式,这是问题之间的一个重要区别:“文件”和“ ./file”

如果文件使用外壳程序解析的字符命名,该怎么办?特别是关于命令正在解释的字符正在运行。

具体来说,“破折号”字符:“-”。但是其他字符对外壳有意义。

例。我的文件名为“ -dingle”

尝试列出文件:

ls -dingle
# ls -dingle
ls: invalid option -- 'e'

更糟糕的是,如果文件名为“ -rf rmbomb *”怎么办?现在尝试将其删除

rm "-rf rmbomb *"

我什至不想尝试运行该示例,但希望您能理解。

那么,如何列出带有破折号的文件?./在前面使用。

# ls ./-dingle
./-dingle

同上 rm


这是处理某些具有奇数名称的文件的有效方法,而我的回答没有考虑类似的文件。在上面的所有示例中,也可以使用文字来代替,以反斜杠形式出现在奇数字符之前,包括上面指定的空格。例如:ls \-dinglels \-rf\ rmbomb\ \*。这是确保任何给定命令集至少一致的一种好方法,因为./在名称之前指定不会在后面转义字符./
后台打印程序

2
碰巧的是,由于转义由外壳而不是命令进行转义,并且参数由命令进行解析,所以转义或引用-并没有任何用处。
Dewi Morgan

2
您听起来好像rm "-rf rmbomb *"实际上会做一些不好的事情,而不仅仅是使rm打印出错。仅当您忘记引用文件名时这才是危险的,因此会发生单词拆分。(特别是在运行rm $file而不是运行的Shell脚本中rm "$file"。但是在那种情况下,*不会扩展,因为在变量扩展的内容上不会进行全局扩展。如果需要,则需要一个eval。)无论如何,如果您的脚本在传递给rm之前先对文件名进行单词拆分,我会创建一个名为space -rf .或类似名称的文件,因此rm ./$i无济于事。
彼得·科德斯

1
顺便说一句,实际错误消息是rm: invalid option -- ' ',从它尝试将空格解释-rf为单字符开关后开始,因为它是同一参数的一部分。(是的,我在一个空目录中运行了此文件,以防万一我忽略了某些内容,而这实际上很危险:P)
Peter Cordes

2
@PeterCordes:在未加引号的变量扩展和命令替换的结果上会发生单词拆分和通配符,除非分别由IFS=''和抑制-f。一个较罕见的示例是awk将具有形式的操作数(不是作为脚本的第一个操作数)foo=bar视为要执行的分配,但要./foo=bar作为要读取的文件。
dave_thompson_085

7

是。

通过file在命令行上运行,BASH将在$ PATH环境变量中搜索该名称的文件。除非文件位于$ PATH变量中的目录中,否则将找不到该文件。

.表示当前目录。相对而言,是./当前目录中。这等效于在目录中工作/home/sheogorath/shivering/isles.img时调用./isles.img时说的话/home/sheogorath/shivering/

因此,它通常用于在您的工作目录中“就地”执行文件。

编辑: 在您的示例中,ls被外壳程序调用并通过使用path变量找到。它的参数将在您的工作目录中处理,无论如何。由于这是的默认设置ls,因此您不会在指定file和显式指定之间看到任何区别,./file因为它们都指向您的当前目录。

并非所有命令都将接受工作目录中的文件路径,并且某些命令希望您在其本身通过配置预定义的目录中声明文件状态。在接受文件作为参数的命令中,这些命令不太常见


1
那是
猛烈的打击

1
这是我从未听说过的任何shell的工作方式。BASH只是最常用的。
后台打印程序

4
$ PATH仅与命令相关,而跟ls在原始问题中提到的命令后面的文件名参数无关。相对于相对路径(相对于当前工作目录)IE ../../dir/filename绝对路径 之间的区别更大/path/to/dir/filename
HBruijn16年

1
为Sheogorath +1 ...并提供正确答案。
科里·奥格本

1
如果它们是默认情况下尝试在工作目录中查找文件的命令的参数,则它们将相同。因此,因为ls它们将始终是同一路径,所以一个路径比另一个路径更明确地指定。在处理参数时,并非所有命令都以这种方式运行,但是大多数命令都以这种方式运行。
后台打印程序
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.