如何在 AppleScript 中定位并关闭特定的终端窗口?

如何在 AppleScript 中定位并关闭特定的终端窗口?

背景

鉴于以下terminal脚本,我想修改osascript以便不是针对front window我针对特定窗口从 AppleScript 打开。

terminal

#!/bin/bash

# Usage:
#     terminal [CMD]             Open a new terminal window and execute CMD
#
# Example:
#     terminal cd "sleep 100"

terminal() {

    # Mac OS only
    [ "$(uname -s)" != "Darwin" ] && {
        echo 'Mac OS Only'
        return
    }

    local cmd=""
    local args="$*"

    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    if [ -n "$args" ]; then
        cmd="$args"
    fi

    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    osascript <<EOF
tell application "Terminal" to tell the front window
    set w to do script "$cmd"
    repeat
        delay 1
        if not busy of w then exit repeat
    end repeat
    close it
end tell
EOF

}

terminal "$@"

问题

目前,由于使用,front window我可以在窗口弹出后将焦点更改为另一个终端窗口,然后当任务do script完成时close it将关闭我当前关注的窗口而不是实际运行的窗口do script

想法

我的一个想法是修改 AppleScript,以便我们获取window id从 AppleScript 创建的窗口的 ,如下所示。但是,close W这行不通。

tell application "Terminal"
    set W to do script ""
    activate
    set S to do script "sleep 5" in W
    repeat
        delay 1
        if not busy of S then exit repeat
    end repeat
    close W
end tell

答案1

基于此 stackexchange回答您可以存储窗口对象然后循环遍历。

然后,您可以关闭打开的窗口,无论它是否处于焦点状态。

    osascript <<EOF
    tell application "Terminal"
        set newTab to do script
        set current settings of newTab to settings set "Grass"
        set theWindow to first window of (every window whose tabs contains newTab)

        do script "$cmd" in newTab
        repeat
            delay 0.05
            if not busy of newTab then exit repeat
        end repeat

        repeat with i from 1 to the count of theWindow's tabs
            if item i of theWindow's tabs is newTab then close theWindow
        end repeat
    end tell
EOF

set current settings of newTab to settings set "Grass"线不是必需的 - 它只是为了以不同的颜色显示相关窗口。

答案2

这样做的方法非常简单,我在之前的一个问题上留下了这样的评论:

根据您想要执行的操作,您可能会发现wAppleScript 中的 值很有用。由 创建的窗口do script将返回对它的 AppleScript 引用(您已将其分配给w),其形式为tab 1 of window id <number>,其中<number>是一个五位左右的 ID 号,在窗口的整个生命周期内保持不变。你必须忽略引用总是包含的事实tab 1 of...,这会产生误导,因为单个窗口中包含的三个选项卡都是tab 1 of...三个不同的id数字。

正如您所注意到的,该close命令不适用于tab,因此您需要window id。从任何命令创建的引用都会do script为您提供tab 1 of window id...,因此您将始终能够引用任何特定do script命令正在运行的窗口:

tell application id "com.apple.Terminal"
    set T to do script "echo $$" --> btw, there's the pid number of the window's sub-shell
    set W to the id of window 1 where its tab 1 = T
        .
        .
     (* doing other stuff *)
        .
        .
    close window id W
end tell

相关内容