web-dev-qa-db-ja.com

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を実行したウィンドウではありません。

アイデア

私が考えていたアイデアの1つは、AppleScriptを変更して、以下のようにAppleScriptから作成されたウィンドウのwindow idを取得することでした。ただし、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
Nicholas Adamou

このstackexchangeに基づいて answer ウィンドウオブジェクトを保存してからループすることができます。

次に、フォーカスがあるかどうかに関係なく、開いたウィンドウを閉じることができます。

    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"行は必要ありません-関連するウィンドウを別の色で表示するだけです。

1
lx07

これを行う方法は非常に簡単で、以前の質問に対してこの効果についてコメントを残しました。

やりたいことによっては、AppleScriptのwの値が役立つ場合があります。 do scriptによって作成されたウィンドウは、(wに割り当てた)AppleScript参照を返します。これはtab 1 of window id <number>の形式になります。ここで、<number>は5または-です。したがって、ウィンドウの存続期間を通じて固定されたままの数字ID番号。 参照に常にtab 1 of...が含まれているという事実を無視する必要があります。これは、1つのウィンドウに含まれる3つのタブがすべてtab 1 of...3つの異なる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
2
CJK