路径中带有 space 的 Apple 脚本参数

Apple script parameter with space in path

我无法执行以下操作 - 因为 $MY_PATH

中有一个 space
osascript -e "tell application \"Terminal\" to do script \"cd $MY_PATH\""

这个可以吗。我知道在普通的 sh 脚本中我需要做类似“$(pwd)" 但我不知道该怎么做,将它传递给 Apple 脚本时?

也许是这样:

printf 'tell application "Terminal" to do script "cd %q"' '/a/path with spaces' |
osascript

结果:

tell application "Terminal" to do script "cd /a/path\ with\ spaces"

或者这样:

printf 'tell application "Terminal" to do script "cd \x27%s\x27"' '/a/path with spaces' |
osascript

结果:

tell application "Terminal" to do script "cd '/a/path with spaces'"

这实际上非常棘手,因为您基本上有两个级别的 quoting/parsing 需要处理:您必须将路径字符串从 shell(您的脚本)完整地获取到 AppleScript,然后从AppleScript 返回 shell(cd 的参数)。您可以将其包裹在多层引号中,让每个翻译展开一层,但这很快就会变得混乱(特别是因为 shell 和 AppleScript 的引号规则截然不同)。

但是您可以使用一些技巧:将路径获取到 AppleScript,将其作为参数而不是脚本的一部分传递给脚本(请参阅 this previous answer to "osascript using bash variable with a space"), then use the AppleScript quoted form of 准备它以与cd:

osascript \
    -e "on run(argv)" \
    -e "set my_path to item 1 of argv" \
    -e "tell application \"Terminal\" to do script \"cd \" & the quoted form of my_path" \
    -e "end" \
    -- "$MY_PATH"

更新:我没有使用过 docker,也没有可用于测试的设置,但我想我知道如何修复组合脚本。首先,让我指出您当前脚本中的一些问题和不必要的混淆:

DOCKER_EVAL=$(printf "%s" 'eval $(docker-machine env default)')

...这只是 DOCKER_EVAL='eval $(docker-machine env default)' 的一个精心设计的等价物——整个 printf "%s" 实际上什么也没做。这也不是您应该使用的;那是 DOCKER_EVAL='eval "$(docker-machine env default)"';双引号可能不是必需的,但建议避免可能的错误分析。现在看看这一行:

SERVER_COMMAND=$(printf "%s;sh %q" "$DOCKER_EVAL" "$SERVER_PATH")

此处 %q 格式字符串要求 SERVER_PATH 为 "quoted",但它以适合 bash 的形式引用,不适用于 AppleScript。在 AppleScript 中包含该字符串可能是导致错误的原因(尽管正如我所说,我没有可用于测试的设置)。

有几种方法可以解决这个问题,但最简单的可能是通过与路径相同的方式传递 DOCKER_EVAL 命令:

DOCKER_EVAL='eval "$(docker-machine env default)"'
osascript \
    -e "on run(argv)" \
    -e "set docker_eval to item 1 of argv" \
    -e "set my_path to item 2 of argv" \
    -e "tell application \"Terminal\" to do script docker_eval & \"; sh \" & the quoted form of my_path" \
    -e "end" \
    -- "$DOCKER_EVAL" "$SERVER_PATH"

...或者,您可以直接在 AppleScript 中包含 eval "$(... 位,但最终会出现多层转义。这样更干净。

顺便说一句,我不知道命令 docker-machine env 是否会导出各种变量,或者只是设置它们;如果它们不导出,sh shell 将不会继承它们;您可能需要 source 来代替。但这在某些方面更丑陋,希望没有必要。