这是我的代码:
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
,当第一个找到这个目录?
花了几个小时调试此功能,无法理解其中的差异。
答案 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
基本相同。反斜杠会转义以下字符;引号用引号转义每个字符。大多数情况下,转义字符会评估为相同字符(\a
与a
相同,因为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所说,小心~
扩展。