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

Ser*_*aev 12 linux filesystems

正如标题所说,*NIX 文件系统有什么区别吗?例如ls filels ./file

JDS*_*JDS 14

我对 SmallLoanOf1M 的解释并不着迷。它在技术上是正确的,但以与问题中的用法示例不匹配的方式回答。

因此,举例来说,以下是问题中两者之间的一个重要区别:“file”和“./file”

如果文件以 shell 解析的字符命名怎么办?特别是关于由正在运行的命令解释的字符。

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

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

尝试列出文件:

ls -dingle
# ls -dingle
ls: invalid option -- 'e'
Run Code Online (Sandbox Code Playgroud)

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

rm "-rf rmbomb *"
Run Code Online (Sandbox Code Playgroud)

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

那么如何列出以破折号开头的文件呢?用./在前面。

# ls ./-dingle
./-dingle
Run Code Online (Sandbox Code Playgroud)

同上 rm

  • 碰巧的是,由于转义是由外壳而不是命令转义的,并且参数由命令解析,因此转义或引用 - 没有任何用处。 (2认同)
  • 你让它听起来像 `rm "-rf rmbomb *"` 实际上会做一些不好的事情,而不仅仅是让 `rm` 打印错误。如果您忘记引用文件名,这只会很危险,因此会发生分词。(特别是在 shell 脚本中,你运行 `rm $file` 而不是 `rm "$file"`。但在这种情况下,`*` 不会扩展,因为 glob 扩展不会发生在变量扩展。如果你想要那个,你需要一个 `eval`。)无论如何,如果你的脚本在传递给 rm 之前对文件名进行分词,我会创建一个名为 `space -rf .` 的文件,所以 ` rm ./$i` 没有帮助。 (2认同)
  • @PeterCordes:分词和通配符确实发生在未加引号的变量扩展和命令替换的结果上,除非分别被 `IFS=''` 和 `-f` 抑制。一个比较少见的例子是 `awk` 将具有形式 `foo=bar` 的操作数(除了作为脚本的第一个操作数)视为要执行的赋值,而将 `./foo=bar` 视为要读取的文件。 (2认同)

Spo*_*ler 7

是的。

通过file在命令行上发出命令,BASH 将在您的 $PATH 环境变量中搜索具有该名称的文件。除非文件驻留在 $PATH 变量中的目录中,否则将无法找到它。

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

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

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

并非所有命令都接受工作目录中的文件路径,有些命令希望您将文件放在他们自己通过配置预先定义的目录中。在接受文件作为参数的命令中,这些命令不太常见

  • $PATH 仅与命令相关,与原始问题中提到的诸如“ls”之类的命令之后的文件名参数无关。这更多的是引用*相对路径*(相对于当前工作目录)即“../../dir/filename”和*绝对路径*“/path/to/dir/filename”之间的区别 (4认同)