複数のターミナルタブを開いてコードを実行するスクリプトを作成するにはどうすればよいですか?


8

ターミナルアプリケーションを開いて、複数のタブを開くスクリプトを自動的に実行し、それぞれで任意のコマンドセットを実行できるようにしたいと考えています。たとえば、1つのタブを開いてディレクトリを変更し、railsサーバーを実行したいとします。別の開いているディレクトリを変更し、ログファイルをテールします。等..

シェルスクリプトまたはアップルスクリプトでこれを行う方法はありますか?

私はこの質問を見つけましたが、終了しないコマンド(railsサーバーの実行など)でタブを開きたい場合は、ハングするようです。

回答:


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実際に実行したいコマンドに置き換えてください。何らかの理由で、ターミナルにはAppleScriptを介して新しいタブを作成するためのアクセス可能な方法がないため、真ん中の長くて見栄えのする行は、ターミナルにタイプTしてその新しいタブを開くように指示するだけで、新しいコマンドが実行されます。

このAppleScriptをそのまま実行するか、Automatorで使用して新しいサービスを作成し、必要に応じてキーボードショートカットを使用してどこからでも実行できます。

その他-新しく開いたターミナルセッションでスクリプト/コマンドを実行する場合は、これを参照できます


2

Appleのターミナルまたは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

新しいタブを開くのはとても簡単なので、コマンドの実行をできるだけ簡単にし、これを昔ながらの方法で行うことをお勧めします。

2つの特定のアクションを呼び出したので、それらを操作してみましょう。私がRailsについて知っていることに基づいて多くの仮定を行うことに注意してください。ただし、必ずしもプロジェクトに固有のものではありません。

長い話を短くするには、コマンドに別名を付けて、やりたいことを実行するか、簡単なシェルスクリプトを作成して、やりたいことを実行します。

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、レールが実行されます。または、「」と入力してmyaを押しTab、オートコンプリートで残りを入力してを押しreturnます。ブーム、サーバー実行中。

拡張子で、ログファイルの末尾を実行する方法は既に理解しているかもしれませんが、とにかく続けます。〜/ binにmyapp.taillogという名前の別のファイルを作成し、次の内容を含めます。

#!/bin/bash

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

ここでも、binフォルダに置き、chmod 700 ~/bin/myapp.taillog、その後、開始後に、サーバ、迅速ヒットレールt、種類をmyapp.taillog、あなたは、ログファイルが印刷されています。

2つのコマンド、2つの追加のキーストローク(タブを開く)、おそらくそれで十分ですか?

ここには2つの非常に明らかな改善点があります。1つは、railsアプリの名前を「検出」できるシェル関数を記述することです。そのため、それぞれにシェルスクリプトを記述する必要はありません。選択したwebbrick / railsサーバーを起動するように設計されたサブコマンドを記述します。いくつかの主要なログファイルを定期的にtail -Fするためのコマンド。

2番目の改善点は、必要な端末操作を行うAppleScriptを記述し、それぞれの内部で適切なコマンドを実行できる可能性があることです。でも率直に言って、私はAppleScriptに夢中になって、bashコードとperlコードで1日中働いているので、私のスキルセットに関連するアドバイスを提供しています:)。


1

質問の文言に基づいてApple端末に縛られているかもしれませんが、iTermは、複数のウィンドウをスクリプト化して管理するためのデフォルトの端末エミュレータよりも優れています。

ブックマークの概念により、一連のウィンドウを簡単に管理できます。AppleScript / Automaterを使用したiTermのスクリプティングは、よりシンプルで強力であり、開発者のWebサイトに文書化されています。(ターミナルと比較して)

通常のターミナルのスクリプトがニーズを満たしていない場合は、チェックしてください。UNIXシェルをカスタマイズして、頻繁に使用するコマンドのエイリアスを設定することを強くお勧めします。新しいウィンドウの初期タスクのスクリプトでこれらを使用しますが、シェルにいて、新しいウィンドウを開く必要がなく、タスクを切り替える必要がある場合にも使用します。


1

スクリプトはすばらしいですが、Automatorを使用して、ターミナルを開いたところに「ウォッチミードゥ」を記録し、好みの数のウィンドウにいくつかのコマンド+ Nキーを投入することもできます。出来上がり。


1

そこ素晴らしいです答え非常によく似た質問 StackOverflowの上の上には、私はちょうどここに/パスタ、それをコピーしますので、それはおそらく、今以上ここに属します。


これは絶対に可能ですが、ある程度の作業が必要になります。最初に必要なのは、設定で必要な各ウィンドウ/タブを設定することです。

ターミナルを開くたびに自動的に開く4つのタブがあります。 DB ShellEditorServer、とShell。これらはすべてSasquatch(質問しないでください)プロジェクト内にあるため、名前が付けられます。これらのそれぞれに、それらに関連付けられた固有のコマンドが必要です。

この場合、を実行していvimます。開始したい特定のディレクトリがある場合は、のようなものを使用できますvim ~/projects/main/。そこに行きたいものは何でも、シェルが開いたときにシェルが実行するコマンドです。次に、すべてのウィンドウ/タブを開く必要があります。

  1. すべてを閉じます。
  2. プロファイルごとに新しいウィンドウを開きます。
    • Shellメニューに移動=> New Tab/ New Window=>上で作成したプロファイルを選択します。
    • 必要なウィンドウまたはタブごとに繰り返します。
  3. すべてのウィンドウやタブを開いたら、それらをウィンドウグループとして保存します。
    • Windowメニューに移動=> Save Window As Group...
    • ウィンドウグループに名前を付けます(これは後で役立ちます)。
    • ターミナルを開くたびにこのグループを開くには、この画面の下部にあるチェックボックスをオンにして、[保存]をクリックします。
  4. すべてのWindows /タブを閉じます(テストする時間です!)。
  5. 新しいウィンドウグループを開きます。
    • Windowメニューに移動=> Open Window Group=>作成したグループを選択します。

これで、同じ位置にあるすべてのウィンドウがポップアップします。で設定した各コマンドSettingsは、それぞれのタブで起動する必要があります。


1
ただのメモですが、回答のImageshack画像リンクが壊れているようです。
ベポーター、2015年

残念ながら、画像も、それを再作成するための古い設定ファイルもありません。=-[
Jack M.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.