路径中带有 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
来代替。但这在某些方面更丑陋,希望没有必要。
我无法执行以下操作 - 因为 $MY_PATH
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
来代替。但这在某些方面更丑陋,希望没有必要。