![在 OSX 终端中,如何打开名称中带有空格的文件?](https://linux22.com/image/1245878/%E5%9C%A8%20OSX%20%E7%BB%88%E7%AB%AF%E4%B8%AD%EF%BC%8C%E5%A6%82%E4%BD%95%E6%89%93%E5%BC%80%E5%90%8D%E7%A7%B0%E4%B8%AD%E5%B8%A6%E6%9C%89%E7%A9%BA%E6%A0%BC%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我使用了一个脚本来为我设置虚拟主机,然后使用 safari 打开 url,但是,我试图更改脚本以便它在 Google Chrome 中打开。
这条线给我带来了麻烦。
OPEN_COMMAND="/usr/bin/open -a /Applications/Google Chrome.app"
我也试过了...
OPEN_COMMAND="/usr/bin/open -a /Applications/Google\ Chrome.app"
..和...
OPEN_COMMAND="/usr/bin/open -a /Applications/'Google Chrome.app'"
该错误表明该文件不存在。
这是在脚本底部使用命令的地方......
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Launch the new URL in the browser
#
/bin/echo -n "Launching virtualhost... "
$OPEN_COMMAND http://$VIRTUALHOST/
/bin/echo "done"
答案1
这实际上有点棘手。当你将命令放在引号中时,你已经转义了该字符串中的特殊字符。
如果在调用变量作为命令时字符串被扩展,则(自动)转义的字符将取消转义。这会导致这种有点意外的行为,因为该字符串中的所有空格都以相同的方式解释,但应该以不同的方式解释。
这可以通过将命令和文件路径放入单独的变量并仅引用必须转义空格的部分来实现:
#!/bin/bash
COMMAND="open -a"
APPPATH="/Applications/Google Chrome.app"
$COMMAND "$APPPATH"
供您编辑:
OPEN_COMMAND="/usr/bin/open -a"
APPPATH="/Applications/Google Chrome.app"
...
$OPEN_COMMAND "$APPPATH" http://$VIRTUALHOST/
答案2
看Bash常见问题解答#50-- 设置命令变量时,无法进行任何形式的引用/转义,因为使用后,它会被分解成单词,而不考虑它可能包含什么引号、转义符等。但是,有几种方法可以更改定义和调用以使其工作(大致按从最灵活到最不灵活的顺序):
使用 shell 函数而不是变量:
open_command() { open -a "/Applications/Google Chrome.app" "$@"; }
open_command "http://$VIRTUALHOST/"
使用数组而不是简单变量:
open_command=( open -a "/Applications/Google Chrome.app" )
"${open_command[@]}" "http://$VIRTUALHOST/"
使用单独的变量(像 mugen kenichi 建议的那样,但使用不会破坏 PATH 的变量名):
open_command="open -a"
open_app="/Applications/Google Chrome.app"
$open_command "$open_app" "http://$VIRTUALHOST/"
(请注意,最后一个选项不会让您恢复使用默认浏览器——没有好的方法可以关闭该应用程序。)
答案3
第三个应该可以工作。如果不能,则意味着某些东西多次扩展了字符串,这意味着您需要多次转义空格。这种情况的常见原因是脚本中的其他地方引用了 $OPEN_COMMAND 而没有在其周围加上引号。确保您正在执行如下操作:
fnord="$OPEN_COMMAND"
...并不是:
fnord=$OPEN_COMMAND
另一个技巧是将脚本中尝试运行 $OPEN_COMMAND 的位置更改为:
echo "$OPEN_COMMAND"
...以确保报价完整无缺。