背景
鉴于以下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
这样做的方法非常简单,我在之前的一个问题上留下了这样的评论:
根据您想要执行的操作,您可能会发现
w
AppleScript 中的 值很有用。由 创建的窗口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