如何转义带有&符号的子目录名称?

RCi*_*ICT 10 shell ksh cd-command quoting

运行 kornshell 并尝试遍历目录树。想cd到一个如下命名的子目录:

 -3ab_&_-3dc.img
Run Code Online (Sandbox Code Playgroud)

我的问题是我需要如何转义此名称中的&符号?我尝试了双引号和反斜杠的不同组合,但没有成功。

Gil*_*il' 13

对于&(或几乎任何其他角色),您有两种简单的可能性。

  • 在整个事情周围加上单引号: ' -3ab_&_-3dc.img'
  • 在每个麻烦的字符前加一个反斜杠: -3ab_\&_-3dc.img

有两个例外:

  • 单引号方法不适用于单引号。反斜杠在单引号中并不特殊,因此您也不能直接使用它。您可以做的是结束单引号字符串,立即使用反斜杠加单引号,然后重新启动单引号。例如,如果目录的名称是foo'bar\qux: cd 'foo'\''bar\qux'。你可以这样记住它:在单引号内,'\''得到一个单引号。
  • 反斜杠方法不适用于换行符:反斜杠换行符只是被忽略。您需要在换行符周围加上单引号。

您也可以使用双引号,但是您需要在某些字符前放置一个反斜杠。单引号更直接。

这里还有一个额外的困难,即目录的名称以破折号开头。该字符告诉cd命令(就像几乎每个命令一样)后面跟着一个选项。破折号不是 shell 所特有的,只是命令所特有的,所以引号不会影响它。您有两种方法可以将一个以破折号开头的参数传递给命令,而无需将其解释为选项:

  • 寻找另一种方式来表达这个论点。对于文件名,加./在前面仍然表示同一个文件。
  • 把论证放在--前面。这告诉命令停止寻找选项。

所以这里有一些方法可以让你进入这个子目录:

cd -- '-3ab_&_-3dc.img'
cd -- -3ab_\&_-3dc.img
cd ./-3ab_\&_-3dc.img
cd './-3ab_&_-3dc.img'
Run Code Online (Sandbox Code Playgroud)


jor*_*anm 5

&符号确实需要转义,但您遇到的问题可能出在前导-,而不是&符号。领先的-cd 认为您正在传递选项。您可以使用./以下方法解决此问题:

cd './-3ab_&_-3dc.img'
Run Code Online (Sandbox Code Playgroud)