Apple脚本参数与路径中的空间

时间:2015-09-29 21:51:32

标签: bash applescript

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

中有空格
osascript -e "tell application \"Terminal\" to do script \"cd $MY_PATH\""

可以这样做。我知道在正常的sh脚本中我需要做类似" $(pwd)"之类的事情,但在将它传递给Apple脚本时我不知道如何做到这一点?

2 个答案:

答案 0 :(得分:1)

也许这就是:

char

结果:

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

答案 1 :(得分:1)

这实际上非常棘手,因为你基本上有两个级别的引用/解析来处理:你必须从shell(你的脚本)到AppleScript的路径字符串完整,然后从AppleScript返回到shell(参数到cd)。你可以将它包装在多层引号中,让每个翻译解开一层,但这很快就会变得混乱(特别是因为shell和AppleScript有明显不同的引用规则)。

但是你可以使用一些技巧:获取AppleScript的路径,将其作为参数传递给脚本而不是脚本的一部分(参见this previous answer to "osascript using bash variable with a space"),然后使用AppleScript {{ 3}}准备与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为"引用",但它以适合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代替它。但这在某些方面更加丑陋,并且希望不会有必要。