如何用AppleScript向Terminal批量传命令,实现一键切换视频输入输出?
解决AppleScript向Terminal传入多行命令时仅执行第一行或打开多窗口的问题
我明白你现在遇到的麻烦——想用AppleScript一键切换视频输入输出,但要么只有第一行命令生效,要么每执行一条命令就弹出新的Terminal窗口,确实很闹心。咱们来一步步解决这个问题。
问题根源拆解
- 单个
do script里的多行命令如果没按Shell规则分隔,Terminal只会识别第一行有效命令,剩下的内容会被直接忽略; - 默认情况下,每次调用
do script如果不指定目标窗口,Terminal都会新建独立窗口执行命令,这就是多段语句开多窗口的原因。
方案一:单do script语句拼接多行命令
把所有需要执行的命令用Shell兼容的方式拼接在一起,比如用分号;分隔,或者转义换行符\n,这样Terminal会在同一个窗口依次执行所有命令。示例代码如下:
on run {input, parameters} tell application "Terminal" -- 方式1:用分号分隔多个命令 do script "nc xxx.xxx.x.xxx 9990 VIDEO OUTPUT ROUTING: 0 3 1 15 2 15; echo '第一条命令执行完成'; 第三条待执行命令" -- 方式2:用转义换行符分隔(可读性更强) -- do script "nc xxx.xxx.x.xxx 9990 VIDEO OUTPUT ROUTING: 0 3 1 15 2 15\n echo '第一条命令执行完成'\n 第三条待执行命令" end tell return input end run
如果你的命令包含特殊字符或需要严格按换行执行,更推荐用\n的方式,Shell会自动识别为换行并依次执行。
方案二:指定同一窗口执行多段do script
如果希望拆分命令为多个do script语句,同时避免打开新窗口,可以先获取一个Terminal窗口(新建或已存在的),然后给每个do script指定in参数为这个窗口。示例代码如下:
on run {input, parameters} tell application "Terminal" -- 优先使用已打开的第一个窗口,没有则新建一个空窗口 set targetWindow to (if exists window 1 then window 1 else do script "") -- 在目标窗口执行第一条命令 do script "nc xxx.xxx.x.xxx 9990 VIDEO OUTPUT ROUTING: 0 3 1 15 2 15" in targetWindow -- 继续在同一窗口执行后续命令 do script "echo '视频路由切换完成'" in targetWindow do script "后续需要执行的命令" in targetWindow end tell return input end run
这样所有命令都会在同一个Terminal窗口内按顺序执行,不会弹出新窗口。
额外小提示:如果希望Terminal执行完命令后保持窗口打开,可以在Terminal偏好设置里调整:打开Terminal → 偏好设置 → 通用 → 当shell退出时,选择“不关闭窗口”或“如果shell正常退出则关闭窗口”(根据需求选择)。
内容的提问来源于stack exchange,提问作者Austin Poythress
相关产品推荐
相关产品推荐

