You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:33:15