如何在Zsh函数中扩展osascript -e内的变量以执行传入命令?
解决Zsh函数中osascript变量未扩展的问题
问题核心是单引号内的变量不会被Zsh解析,你原来的代码里$1被包裹在单引号字符串中,所以直接作为文本传递给了osascript,没有被替换成实际参数。以下是两种可行的解决方案:
方案1:混合单双引号拼接字符串
通过拆分单引号和双引号,让$1处于Zsh能解析的双引号环境中:
function newterm() { osascript -e 'tell app "Terminal" to do script "'"$1"'"' }
调用示例:
newterm 'echo hello world' newterm 'ssh user@remotehost "ls -l; echo Done"'
方案2:用双引号包裹osascript命令并转义内部引号
将osascript的脚本内容用双引号包裹,同时转义内部的双引号,确保Zsh能解析$1:
function newterm() { osascript -e "tell app \"Terminal\" to do script \"$1\"" }
处理复杂命令(含特殊字符/嵌套引号)
如果你的命令包含单引号、空格或其他特殊字符,建议用Zsh的${(q)1}参数展开来自动转义所有特殊字符,避免解析错误:
function newterm() { local escaped_cmd=${(q)1} osascript -e "tell app \"Terminal\" to do script \"$escaped_cmd\"" }
这个版本能完美适配你提到的嵌套ssh命令场景,比如:
newterm 'ssh myuser@server "cd /var/log; tail -f auth.log"'
内容的提问来源于stack exchange,提问作者Jessica Schlumpberger
相关产品推荐
相关产品推荐

