如何在路径中转义“ ` ”(重音符号/反引号)?

如何在路径中转义“ ` ”(重音符号/反引号)?

我倾向于在经常使用的前缀带有“重音符号”的文件和文件夹(非 shift 波浪号、反引号或普通的重音符号,随便你..),因为它很容易获取,让我按字母顺序对内容进行排序,同时让我选择在顶部显示一些项目。它运行良好,除了当我通过 CLI 或 SSH/SCP 访问这些文件时。

如果我尝试运行一个命令,调用文件 unescaped ↝ 它会将我带入一个交互式会话..例如 ↯

# scp -r dns.local:/`Downloads/CrazyRussianCars/ ~/
>

但如果我尝试逻辑解决方案 ↯

# scp -r dns.local:/\`Downloads/CrazyRussianCars/ ~/
bash: -c: line 0: unexpected EOF while looking for matching ``'
bash: -c: line 1: syntax error: unexpected end of file

我知道“新”规则是使用像 export NOW=$(date)vs export NOW= `date` 这样的语法(事实上,我曾经有过一段很痛苦的经历写作后者在 SE MD 语法中...),但这与ENV任何脚本无关......

笔记:Mac OS X 环境,但话虽如此,GUI 在日常处理这个字符时从来没有遇到过问题,通常,如果终端出现语法问题,Apple 会很好地禁用 GUI 中的行为...不确定这是不是一个错误,或者处理此类路径的技术是否只是模糊不清..但到目前为止,我一直找不到“逃避”的方法

答案1

您可以像 Jed Daniels 提到的那样使用 3 个反斜杠,或者您可以将其括在单引号中(')并使用单个反斜杠。

两者的示例如下。

$ touch dir/'`rik' 
$ ls -l dir
total 1865376
-rw-r--r--  1 rik  staff          0 Jul  1 09:51 `rik 
$ scp localhost:dir/\\\`rik ./ `rik         
100%    0     0.0KB/s   00:00     
$ scp localhost:dir/'\`rik' ./ `rik     
100%    0     0.0KB/s   00:00     
$

答案2

三个反斜杠就可以了:

jed@jed-osx:~$ ls -la \`foo
ls: `foo: No such file or directory
jed@jed-osx:~$ scp desk:\\\`foo .
`foo                                            100%    0     0.0KB/s   00:00    
jed@jed-osx:~$ ls -la \`foo
-rw-r--r--  1 jed  staff  0 Jul  1 09:45 `foo
jed@jed-osx:~$ rm \`foo

第一个反斜杠转义了反引号,因此将其发送到另一端,但另一端会抛出错误,因为它期望反引号成对出现。第二个反斜杠转义了第一个反斜杠,然后您需要额外的两个反斜杠,以便将转义的反斜杠发送到另一端。

编辑:正如 Rik 提到的,您也可以使用单引号来实现。我没有想到这一点,因为您不能将其与变量一起使用(在单引号中时,它们不会在本地系统上扩展)。

答案3

通常,命令行会被 shell 解释一次。但是,由于历史原因,scp 还会将文件名传递给远程 shell,因此文件名会被 shell 解释两次。这也是使诸如此类的事情scp remote:'/path/prefix*' /path/local/得以实现的原因,远程 shell 正在扩展/path/prefix*

避免第二次扩展的最简单方法是使用 sftp,它不使用远程 shell。它仍然进行全局扩展,但由于您可以在 stdin 上为其提供命令,因此您可以完全避免本地 shell 扩展。

除此之外,您可以使用任何常规的 shell 引用机制,包括@Jed Daniels 和@Rik Schneider 提供的机制,但我想解释实际情况并提及 sftp。

(你可以在 scp 文件名中使用各种 shell 功能,例如scp server:\$HOME/file dest将使用偏僻的shell 的想法$HOME,而如果你取出\,它会使用你的当地的壳的。)。

相关内容