您如何输入名称仅为减号的目录?

Der*_*ler 26 bash cd-command

我将lessn下载到我的网络服务器并解压缩它。

它包含一个名为-. 我以为我知道如何处理这个问题,但我不知道。

我试过了cd -- -,但没有达到预期的效果。使用引号似乎也不会影响它。我把斜线到处都是,无济于事。

更改到此文件夹的正确方法是什么?

小智 34

你想避免它成为一个参数,因此我们尝试在它前面加上一些东西。可以使用 访问当前目录.,因此-可以交替使用 访问子文件夹./-

cd ./-
Run Code Online (Sandbox Code Playgroud)

cd -- -不起作用的原因是,如果将rm(see man rm) 与cd(see man bashor man cd)进行比较,则实现方式不同,cd具有不同的解释,将其-视为参数 (see man bashor man cd)。

还应该注意的是,这cd是一个 shell 内置函数,可以在这个答案中阅读:

cd不是外部命令 - 它是一个 shell 内置函数。它在当前 shell 的上下文中运行,而不是像外部命令那样,在 fork/exec 的上下文中作为一个单独的进程运行。

有一个外部cd命令,但它的作用完全不同

这解释了为什么实现不同,因为BashCoreutils是两个不同的东西。

让我们假设您不相信这一点,我们如何确认?使用whichtype

 $ which cd && type cd
which: no cd in (/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.7.2:/usr/games/bin
cd is a shell builtin
 $ which rm && type rm
/bin/rm
/bin/rm is /bin/rm
Run Code Online (Sandbox Code Playgroud)

参见man which更多的信息,man bashman typetype

  • 不,“--”在所有标准实用程序中都实现,但旨在结束选项。“-”本身不被识别为选项,而是作为上一个目录。 (4认同)
  • 正确的解决方案,但解释是错误的。`cd` 是内置函数完全无关紧要。`cd -- -` 不起作用的原因是 `-` 是一个操作数,而不是一个选项。 (4认同)

Gil*_*il' 22

减号(又名破折号)本身不是选项,而是操作数(即不是选项的参数)。正因为如此,放在--它之前没有效果。破折号是 中的操作数,cd -并且仍然是 中的操作数cd -- -。与其他标准实用程序一样,cd将操作数视为操作数,而不管它--之前是否存在。

cd命令为操作数分配了特殊含义-。其他任何东西都是要切换到的目录。cd -- -a切换到名为 的目录-a,因为-a作为操作数并不特殊,并且--防止cd将其视为选项。这对-单独来说不起作用,这不是一种选择。

加上引号-不会有帮助,因为-无论如何最终都会传递操作数。

因此,您唯一的办法是找到表达同一想法的另一种方式,即同一目录的另一个名称。幸运的是,有一个简单的方法:如果./在相对文件名之前添加,它仍然表示同一个文件。将./确实有差别这是在我们的情况无关:CDPATH当目录名称开头没有咨询/./../。因此:

cd ./-
Run Code Online (Sandbox Code Playgroud)

另一种方法,因为-是一个目录,所以/在它后面添加一个。/在文件名末尾添加 a可确保将文件视为目录(特别是,如果文件是指向目录的符号链接,则该命令将对目录本身而不是符号链接进行操作),否则会使没有不同。因此:

cd -- -/
Run Code Online (Sandbox Code Playgroud)

-/顺便说一下,完成代码建议写入,但在 bash 中,它实际上只--在它之前使用,bash 没有cd -/(zsh有) 的特殊情况。


iru*_*var 5

通过路径进行资格赛是一种选择。

cd ./-
Run Code Online (Sandbox Code Playgroud)