我倾向于在经常使用的前缀带有“重音符号”的文件和文件夹(非 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
,而如果你取出\
,它会使用你的当地的壳的。)。