Applescript 在当前空间打开一个新的终端窗口

Applescript 在当前空间打开一个新的终端窗口

是的,我在使用 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

相关内容