是的,我在使用 Apple Script 时遇到了糟糕的体验。
我需要在当前桌面空间中打开一个新的终端窗口。不要将我移至正在运行终端的另一个空间,然后打开另一个终端窗口。
当然,如果终端没有运行,那么它应该启动一个新的终端进程。
答案1
tell application "Terminal"
do script " "
activate
end tell
这看起来很奇怪,但它利用了终端处理传入的“执行脚本”命令的奇怪之处;它会为每个命令创建一个新窗口。如果您愿意,您实际上可以用一些有用的东西来替换它;它会在打开新窗口后立即执行您想要的任何操作。
答案2
如果在 do script " " 之间没有任何文本,您将不会在终端中获得额外的命令提示符。
tell application "Terminal"
do script ""
activate
end tell
答案3
我想到了三种不同的方法(前两种是从别处偷来的,但我忘了在哪里了)。我使用第三种方法,它从 applescript 调用一个 shell 脚本,因为我想每次都打开一个新窗口,而且它是最短的。
与至少自 10.10 以来内置于 OS X 中的脚本不同,所有这些都会在查找器窗口中的当前工作目录中打开终端(即,您不必选择文件夹即可打开它)。
还包括一些 bash 函数来完成 Finder > Terminal > Finder 循环。
1. 重新使用现有选项卡或创建一个新的终端窗口:
tell application "Finder" to set myDir to POSIX path of (insertion location as alias)
tell application "Terminal"
if (exists window 1) and not busy of window 1 then
do script "cd " & quoted form of myDir in window 1
else
do script "cd " & quoted form of myDir
end if
activate
end tell
2. 重复使用现有选项卡或创建新的终端选项卡:
tell application "Finder" to set myDir to POSIX path of (insertion location as alias)
tell application "Terminal"
if not (exists window 1) then reopen
activate
if busy of window 1 then
tell application "System Events" to keystroke "t" using command down
end if
do script "cd " & quoted form of myDir in window 1
end tell
3. 每次通过从 applescript 调用的 shell 脚本生成一个新窗口
tell application "Finder"
set myDir to POSIX path of (insertion location as alias)
do shell script "open -a \"Terminal\" " & quoted form of myDir
end tell
4.(额外奖励)Bash 别名可在终端中为当前工作目录打开一个新的查找器窗口
将此别名添加到您的.bash_profile。
alias f='open -a Finder ./'
5.(额外奖励)将终端窗口中的目录更改为 Finder 前端窗口的路径
将此功能添加到您的.bash_profile。
cdf() {
target=`osascript -e 'tell application "Finder" to if (count of Finder windows) > 0 then get POSIX path of (target of front Finder window as text)'`
if [ "$target" != "" ]; then
cd "$target"; pwd
else
echo 'No Finder window found' >&2
fi
}
答案4
上述答案仅在终端已运行时才有效。否则它会同时打开两个终端窗口 - 一个是因为 ,do script
另一个是因为activate
。
您可以使用简单的 if ... else 来防止这种情况:
if application "Terminal" is running then
tell application "Terminal"
do script ""
activate
end tell
else
tell application "Terminal"
activate
end tell
end if
奖金:
如果您想直接运行命令,您可以通过按键来完成(不是很优雅 - 我知道!但它有效)
[...]
else
tell application "Terminal"
activate
tell application "System Events" to keystroke "ls -la"
tell application "System Events" to key code 36
end tell
end if