我无法执行以下操作 - 因为$MY_PATH
osascript -e "tell application \"Terminal\" to do script \"cd $MY_PATH\""
可以这样做。我知道在正常的sh脚本中我需要做类似" $(pwd)"
之类的事情,但在将它传递给Apple脚本时我不知道如何做到这一点?
答案 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
代替它。但这在某些方面更加丑陋,并且希望不会有必要。