一个人如何在路径中逃脱“`”(重音/反勾号)?


13

我倾向于在常用文件和文件夹的前面加上“重音符号”(不移动波浪号,反勾号或普通的重音,如“ haveveve ..”),因为这很容易理解,让我按字母顺序排序,同时让我选择在顶部显示一些项目。它工作得很好,除非我去通过CLI或SSH / SCP访问这些文件。

如果我尝试运行命令,请调用未转义的文件↝它将使我进入交互式会话。例如↯

# 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)呢?
JamesRyan 2011年

在我看来,反引号的破坏性较小(对我而言),并且在将其重新用作排序定界符时,具有较少的固有语义包bag。
mralexgray 2011年

Answers:


10

您可以使用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     
$

太棒了 我想我会选择这个答案,因为有两种方法很高兴。无论哪种方式,您也可以在本地使用此技术(仅使用一个斜杠),或者对于厌恶斜杠,不使用斜线,而仅对问题文件或目录使用单引号技术。
mralexgray 2011年

5

应该使用三个反斜杠:

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/工作正常进行的原因,远程外壳正在扩展/path/prefix*

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

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

(您可以在scp文件名中使用各种shell功能,例如,scp server:\$HOME/file dest将使用远程 shell的主意$HOME,而如果删除\,它将使用本地 shell的主意。)。

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.