路径中转义和引用空格有什么区别?

时间:2014-10-06 17:02:59

标签: linux bash ubuntu

这是我的代码:

cp "./somepath/somefile.ext" ~/Library/MobileDevice/Provisioning\ Profiles/

echo "fail here"
ls -l ~/Library/MobileDevice/Provisioning\ Profiles/
echo "but success here"
ls -l "~/Library/MobileDevice/Provisioning Profiles/"

为什么第二个ls返回ls: ~/Library/MobileDevice/Provisioning Profiles/: No such file or directory,当第一个找到这个目录?

花了几个小时调试此功能,无法理解其中的差异。

3 个答案:

答案 0 :(得分:2)

我们问ShellCheck

In yourscript line 6:
ls -l "~/Library/MobileDevice/Provisioning Profiles/"
       ^-- SC2088: Note that ~ does not expand in quotes.

结合~和引号的goes on to explain,您可以将~留在外面:

ls -l ~/"Library/MobileDevice/Provisioning Profiles/"

答案 1 :(得分:2)

很少。 "a b"\a\ \b基本相同。反斜杠会转义以下字符;引号用引号转义每个字符。大多数情况下,转义字符会评估为相同字符(\aa相同,因为a没有特殊含义。)

您看到的错误是因为代字号扩展仅适用于不带引号的~。您的第一个ls应该会成功,因为~会扩展到您的主目录。第二个应该失败,因为没有名为~的目录。

答案 2 :(得分:0)

它主要取决于您正在执行的命令(读取程序)以及它如何处理您传递的参数。

这就是说,我不得不在处理空格时更喜欢引用,因为它是一种更通用的方法。

例如,当使用scp时,您经常需要两次转义第二个参数,因为它在本地转义然后在远程端转义:

scp ubuntu@localhost.com:"'a/b/My File a b c.xls'" .
scp ubuntu@localhost.com:a/b/My\\\ File\\\ a\\\ b\\\ c.xls .

正如@ that-other-guy所说,小心~扩展。