2014-10-06 44 views
0

这里是我的代码:在路径中转义和引用空格有什么区别?

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,当第一个发现这个目录?

花了很多时间来调试此功能,并且无法理解的差异。

回答

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/" 
+0

那真棒,谢谢! – 2014-10-06 17:08:27

0

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

这就是说,必须应付的空间时,我总是喜欢引号,因为它是一个更通用的方法。

例如,使用scp时,你经常需要逃避的第二个参数的两倍,因为它是在本地,然后逃脱远端:

scp [email protected]:"'a/b/My File a b c.xls'" . 
scp [email protected]:a/b/My\\\ File\\\ a\\\ b\\\ c.xls . 

由于@是,另一人说,小心到~扩展。

+0

re:scp,最好让shell为你引用,就像'printf -v quoted_name%q“$ name”; scp [email protected]:“$ quoted_name”.',而不是鼓励人们自己做......在处理不可信输入的脚本中更是如此。 – 2014-10-06 17:13:56

2

很少。 "a b"\a\ \b基本相同。反斜杠转义下面的字符;引号使用引号将每个字符都转义出来。大多数时候,一个转义字符的计算结果为相同的字符(\a相同a,因为a没有特殊含义)。

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

相关问题