Bagaimana saya bisa menulis skrip untuk membuka banyak tab terminal dan menjalankan kode di dalamnya?

8

Saya ingin dapat membuka aplikasi terminal dan memilikinya secara otomatis menjalankan skrip yang membuka beberapa tab dan menjalankan serangkaian perintah yang sewenang-wenang di masing-masing. Sebagai contoh saya ingin satu tab untuk membuka, mengubah direktori, dan menjalankan server rails; punya direktori lain yang terbuka, ubah, dan ikuti file log; dll ..

Apakah ada cara untuk melakukan ini dengan skrip shell atau applescript?

Saya menemukan pertanyaan ini tetapi tampaknya hang jika saya ingin membuka tab dengan perintah yang tidak berakhir (seperti menjalankan server rel).

Andrew Hubbs
sumber

Jawaban:

5

Ini sedikit hacky, tetapi Anda dapat mencapainya di AppleScript. Jika ada jumlah tab yang Anda inginkan, dan perintah preset yang ingin Anda jalankan, ini tidak sulit.

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

Tentu saja, ganti firstCommanddengan perintah mana pun yang Anda benar-benar ingin jalankan, dan seterusnya. Untuk alasan apa pun, Terminal tidak benar-benar memiliki cara yang dapat diakses untuk membuat tab baru melalui AppleScript, sehingga garis yang panjang dan tidak jelas di tengahnya hanya memberitahu Terminal untuk mengetik Tuntuk membuka tab baru itu, dan kemudian perintah baru akan dijalankan di dalamnya.

Anda dapat menjalankan AppleScript ini apa adanya, atau menggunakannya di Automator untuk membuat layanan baru, yang kemudian dapat Anda jalankan dari mana saja menggunakan pintasan keyboard jika Anda mau.

Ekstra - Jika Anda ingin menjalankan beberapa skrip / perintah di sesi terminal yang baru dibuka, Anda dapat merujuk ini

Itai Ferber
sumber
2

Berikut ini adalah skrip shell yang akan melakukan apa yang Anda inginkan - baik untuk Terminal Apple atau iTerm (kami memiliki pengguna keduanya).

Untuk tab yang Anda buka, ini akan menjalankan file batch lain di setiap tab, seperti satu untuk kucing jantan, satu untuk Anda db, dll.

#!/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
bbezanson
sumber
1

Karena sangat sepele untuk membuka tab baru, saya akan menyarankan untuk membuat eksekusi perintah Anda sepele mungkin, dan melakukan ini dengan cara kuno.

Anda memanggil dua tindakan spesifik, jadi mari kita bekerja dengan itu. Perhatikan bahwa saya akan membuat banyak asumsi berdasarkan apa yang saya ketahui tentang Rails, tetapi belum tentu spesifik untuk proyek Anda.

Untuk mempersingkat cerita, alias perintah untuk melakukan apa yang Anda inginkan juga, atau buat skrip shell sepele untuk melakukan apa yang Anda inginkan.

Buat skrip shell bernama myapp.start, dengan konten:

#!/bin/bash

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

Anda mungkin juga harus membuat file bernama .bash_profile di direktori home Anda, atau memodifikasi yang sudah ada, dan menambahkan baris seperti;

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

Lalu, buat direktori bin di folder rumah Anda, dan pindahkan skrip myapp.start ke dalamnya. Pastikan juga pemiliknya menjalankan bit minimal ( chmod 700 myapp.start).

Kemudian, buka Terminal.app, ketik myapp.start, dan Anda memiliki rel yang berjalan. Atau, ketik myalalu tekan Tab, dan biarkan autocomplete mengisi sisanya, tekan return. Boom, server berjalan.

Dengan ekstensi, Anda mungkin sudah mengerti bagaimana melakukan file log tail, tapi saya akan melanjutkan. Buat file lain di ~ / bin bernama myapp.taillog, dengan konten:

#!/bin/bash

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

Sekali lagi, letakkan di folder bin chmod 700 ~/bin/myapp.taillog,, kemudian setelah memulai kemudian rails server, tekan dengan cepat t, ketik myapp.taillog, dan Anda memiliki file log yang sedang dicetak.

Dua perintah, dua tombol tambahan (membuka tab), mungkin itu cukup?

Ada dua peningkatan yang sangat jelas di sini. Salah satunya adalah menulis fungsi shell yang mampu "menemukan" nama-nama aplikasi rel, sehingga Anda tidak harus menulis skrip shell untuk masing-masing, menulis sub-perintah yang dirancang untuk memulai webbrick / server rel pilihan Anda, dan perintah untuk ekor -Menemukan beberapa file log kunci secara rutin.

Peningkatan kedua adalah kemungkinan Anda dapat menulis AppleScript yang melakukan interaksi terminal yang diperlukan, dan eksekusi perintah yang sesuai di dalamnya. Tapi terus terang, saya payah di AppleScript dan bekerja di kode bash dan kode perl sepanjang hari, jadi saya menawarkan saran yang relevan dengan keahlian saya :).

Jason Salaz
sumber
1

Meskipun Anda mungkin terikat pada terminal Apple berdasarkan kata-kata dari pertanyaan Anda, iTerm lebih unggul daripada emulator terminal default untuk skrip dan mengelola beberapa jendela.

Konsep bookmark memungkinkan manajemen yang mudah dari satu set windows. Scripting iTerm menggunakan AppleScript / Automater lebih sederhana, lebih kuat, dan lebih baik didokumentasikan di situs web pengembang . (dibandingkan dengan terminal)

Periksalah jika Anda menemukan skrip terminal normal untuk tidak memenuhi kebutuhan Anda. Saya juga sangat menyarankan Anda melihat mengkustomisasi shell unix Anda untuk mengatur alias untuk perintah yang sering digunakan. Anda akan menggunakannya dalam skrip tugas-tugas awal untuk windows baru, tetapi juga kapan saja Anda berada dalam shell dan perlu beralih tugas daripada harus membuka jendela baru.

bmike
sumber
1

Script bagus dan semuanya, tetapi Anda juga bisa menggunakan Automator untuk merekam 'Watch Me Do' di mana Anda membuka Terminal, dan melemparkan beberapa Command + N untuk # jendela pilihan Anda. Et voila.

David Metcalfe
sumber
1

Ada jawaban yang bagus untuk pertanyaan yang sangat mirip di StackOverflow, tapi mungkin itu sudah ada di sini sekarang, jadi saya hanya akan menyalin / menempelkannya di sini.


Ini benar-benar mungkin, tetapi itu akan membutuhkan pekerjaan Anda. Hal pertama yang Anda butuhkan adalah mengatur setiap jendela / tab yang Anda inginkan di Pengaturan Anda.

Saya memiliki 4 tab yang saya buka secara otomatis setiap kali saya membuka Terminal. DB Shell, Editor, Server, Dan Shell. Ini semua dalam proyek Sasquatch(jangan tanya), demikian penamaannya. Masing-masing harus memiliki perintah unik yang terkait dengannya.

Dalam hal ini, saya mengeksekusi vim. Jika Anda memiliki direktori tertentu yang ingin Anda mulai, Anda dapat menggunakan sesuatu seperti vim ~/projects/main/. Benar-benar apa pun yang Anda ingin masuk ke sana adalah perintah shell akan mengeksekusi ketika terbuka. Sekarang Anda perlu membuka semua windows / tab Anda:

  1. Tutup semuanya.
  2. Buka jendela baru untuk masing-masing profil Anda.
    • Buka Shellmenu => New Tab/ New Window=> Pilih profil yang Anda buat di atas.
    • Ulangi untuk setiap jendela atau tab yang Anda inginkan.
  3. Setelah semua jendela dan / atau tab terbuka, simpanlah sebagai Grup Jendela.
    • Pergi ke Windowmenu => Save Window As Group....
    • Beri nama Grup Jendela Anda (ini berguna nanti).
    • Jika Anda ingin grup ini terbuka setiap kali Anda membuka Terminal, centang kotak di bagian bawah layar ini, lalu tekan save.
  4. Tutup semua Windows / Tab Anda (saatnya mengujinya!).
  5. Buka Grup Jendela baru Anda.
    • Pergi ke Windowmenu => Open Window Group=> Pilih grup yang baru saja Anda buat.

Ini akan memunculkan semua jendela yang baru saja Anda miliki, dalam posisi yang sama. Setiap perintah yang Anda atur Settingsharus diluncurkan di tab masing-masing.

Jack M.
sumber
1
Sekedar catatan, tautan gambar Imageshack dalam jawaban Anda tampaknya rusak.
beporter
Sayangnya saya tidak memiliki gambar, atau file pengaturan lama untuk membuatnya kembali. = - [
Jack M.