如何编写脚本以打开多个终端选项卡并在其中执行代码?


8

我希望能够打开终端应用程序,并使其自动运行打开多个选项卡的脚本,并在每个选项卡中运行任意命令集。例如,我想要一个选项卡来打开,更改目录并运行Rails服务器。具有另一个打开,更改目录并尾随日志文件的功能;等等..

有没有办法使用shell脚本或applescript?

我发现了这个问题,但是如果我想使用不结束的命令(例如运行rails服务器)打开选项卡,它似乎会死机。

Answers:


5

这有点棘手,但是您可以在AppleScript中实现。如果您要使用预定数量的选项卡,并希望运行预设的命令,这并不困难。

tell application "Terminal"
    -- Activate it.
    activate

    set targetWindow to 0

    -- Get a window that's not busy.
    -- If there are no open windows, open one.
    if count of windows is greater than 0 then
        repeat with currentWindow in windows
            if currentWindow is not busy then
                set targetWindow to currentWindow
            end if
        end repeat
    else
        do script ""
        set targetWindow to window 1
    end if

    -- Do command 1.
    set firstCommand to "cd ~/Desktop; clear"
    do script firstCommand in targetWindow

    -- Open a new tab.
    tell application "System Events" to tell process "Terminal" to keystroke "t" using command down

    if count of windows is greater than 0 then
        repeat with currentWindow in windows
            if currentWindow is not busy then
                set targetWindow to currentWindow
            end if
        end repeat
    else
        do script ""
        set targetWindow to window 1
    end if

    -- Do command 2.
    set secondCommand to "cd /Applications; clear"
    do script secondCommand in targetWindow

    -- And so on...
end tell

当然,用firstCommand您实际要运行的命令替换,依此类推。无论出于何种原因,Terminal确实没有通过AppleScript创建新选项卡的可访问方法,因此,中间长长的,容易受攻击的外观线只是告诉Terminal键入T以打开该新选项卡,然后在其中执行新命令。

您可以按原样运行此AppleScript,或者在Automator中使用它来创建新服务,然后可以根据需要使用键盘快捷键在任何地方执行该服务。

其他-如果您要在新打开的终端会话中触发一些脚本/命令,可以参考此内容


2

这是一个可以执行您想要的操作的Shell脚本-对于Apple的Terminal或iTerm(我们都有这两个用户)。

对于打开的选项卡,这将在每个选项卡中执行另一个批处理文件,例如一个用于tomcat的文件,一个用于db的文件等。

#!/bin/bash

function tab () {
    local cmd=""
    local cdto="$PWD"
    local args="$@"

    if [ -d "$1" ]; then
        cdto=`cd "$1"; pwd`
        args="${@:2}"
    fi

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

    if [ $TERM_PROGRAM = "Apple_Terminal" ]; then
        osascript 
            -e "tell application \"Terminal\"" \
                -e "tell application \"System Events\" to keystroke \"t\" using {command down}" \
                -e "do script \"cd $cdto; clear $cmd\" in front window" \
            -e "end tell"
            > /dev/null
    elif [ $TERM_PROGRAM = "iTerm.app" ]; then
        osascript
            -e "tell application \"iTerm\"" \
                -e "tell current terminal" \
                    -e "launch session \"Default Session\"" \
                    -e "tell the last session" \
                        -e "write text \"cd \"$cdto\"$cmd\"" \
                    -e "end tell" \
                -e "end tell" \
            -e "end tell" \
            > /dev/null
    fi
}

tab path_to_script1 sh script1
tab path_to_script2 sh script2
tab path_to_script3 sh script3

1

由于打开一个新选项卡非常简单,因此我建议您尽可能简单地执行命令,并以老式的方式执行。

您调出了两个特定的动作,因此让我们一起使用它们。请注意,我将根据我对Rails的了解做出许多假设,但不一定特定于您的项目。

简而言之,可以给命令添加别名以执行您想要的操作,或者创建一个简单的Shell脚本来执行您想要的操作。

创建一个名为的shell脚本myapp.start,其内容如下:

#!/bin/bash

cd Development/rails/myapp
# Do any common environment initializations here, such as RAILS_ENV=development
script/server

您可能还必须在主目录中创建一个名为.bash_profile的文件,或者修改一个已经存在的文件,并添加如下一行:

export PATH="$HOME/bin:${PATH}"

然后,在您的主文件夹中创建一个bin目录,并将myapp.start脚本移入其中。确保它也至少具有所有者执行位(chmod 700 myapp.start)。

然后,打开Terminal.app,键入myapp.start,然后运行Rails。或者,键入,mya然后按Tab,让自动完成功能填充其余内容,然后按return。动臂,服务器正在运行。

通过扩展,您可能已经了解如何做日志文件尾部,但是无论如何我都会继续。在〜/ bin中创建另一个文件myapp.taillog,内容如下:

#!/bin/bash

tail -F ~/Development/rails/myapp/logs/development.log

再次将其放置在bin文件夹中chmod 700 ~/bin/myapp.taillog,然后在启动Rails服务器之后,快速点击t,键入myapp.taillog,然后您正在打印日志文件。

两个命令,两个附加的按键(打开选项卡),也许就足够了?

这里有两个非常明显的改进。一种是编写一个能够“发现” rails应用程序名称的shell函数,因此您不必为每个脚本编写一个shell脚本,编写一个旨在启动选择的webbrick /您的rails服务器的子命令,然后尾部命令-F'定期添加一些关键日志文件。

第二个改进是您可能编写了一个AppleScript,它可以进行必要的终端交互,并在每个脚本内部执行适当的命令。但坦率地说,我全天都在学习AppleScript,并在bash代码和perl代码中工作,所以我提供与我的技能有关的建议:)。


1

尽管您可能会根据问题的措辞将您绑定到Apple终端,但是iTerm在编写和管理多个窗口方面优于默认的终端仿真器。

书签的概念允许轻松管理一组窗口。使用AppleScript / Automater编写iTerm脚本更简单,功能更强大,并且在开发人员的网站上记录得更好。(与终端相比)

如果发现普通终端的脚本不能满足需要,请进行检查。我也强烈建议您研究定制unix shell以便为常用命令设置别名。您将在用脚本编写新窗口的初始任务时使用它们,也可以在需要使用Shell且无需切换新窗口的任何时候使用它们。


1

脚本很不错,但是您也可以使用Automator在打开Terminal的地方录制一个“ Watch Me Do”,并为您首选的Windows窗口添加几个Command + N。等等。


1

有一个伟大的答案,以一个非常类似的问题在StackOverflow上,但它可能属于在这里了,所以我就复制/面食它在这里。


这是绝对可能的,但是您将需要做一些工作。您需要做的第一件事是在“设置”中设置所需的每个窗口/选项卡。

我有4个标签,每次打开Terminal时都会自动打开。 DB ShellEditorServer,和Shell。这些都在Sasquatch(不要问)项目中,因此命名。这些中的每一个都应具有与其相关联的唯一命令。

在这种情况下,我正在执行vim。如果您碰巧要从某个特定目录开始,则可以使用vim ~/projects/main/。实际上,无论您要输入什么内容,shell都会在打开时执行该命令。现在,您需要打开所有窗口/选项卡:

  1. 关闭所有内容。
  2. 为您的每个配置文件打开一个新窗口。
    • 转到Shell菜单=> New Tab/ New Window=>选择您在上面创建的配置文件。
    • 对所需的每个窗口或选项卡重复此操作。
  3. 打开所有窗口和/或选项卡后,将它们另存为窗口组。
    • 转到Window菜单=> Save Window As Group...
    • 为您的窗口组命名(稍后有帮助)。
    • 如果希望每次打开终端时都打开此组,请选中此屏幕底部的框,然后单击“保存”。
  4. 关闭所有Windows /制表符(时间来测试它!)。
  5. 打开新的窗口组。
    • 转到Window菜单=> Open Window Group=>选择刚刚创建的组。

这将在相同位置弹出您刚拥有的所有窗口。您设置的每个命令Settings都应在各自的选项卡中启动。


1
仅需注意,答案中的Imageshack图片链接似乎已损坏。
beporter 2015年

不幸的是,我没有图像,也没有旧的设置文件来重新创建它。=-[
杰克M.15年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.