ฉันจะเขียนสคริปต์เพื่อเปิดหลายแท็บเทอร์มินัลและเรียกใช้โค้ดในแท็บได้อย่างไร


8

ฉันต้องการที่จะสามารถเปิดแอปพลิเคชั่นเทอร์มินัลและให้มันรันสคริปต์ที่เปิดหลายแท็บโดยอัตโนมัติและเรียกใช้ชุดคำสั่งโดยพลการในแต่ละอัน ตัวอย่างเช่นฉันต้องการเปิดหนึ่งแท็บเปลี่ยนไดเรกทอรีและเรียกใช้เซิร์ฟเวอร์ทางรถไฟ มีอีกเปิดการเปลี่ยนแปลงไดเรกทอรีและหางไฟล์บันทึก; ฯลฯ ..

มีวิธีทำอย่างใดอย่างหนึ่งกับเชลล์สคริปต์หรือ applescript?

ฉันพบคำถามนี้แต่ดูเหมือนว่าจะแฮงค์หากฉันต้องการเปิดแท็บที่มีคำสั่งที่ไม่สิ้นสุด (เช่นการรันเซิร์ฟเวอร์ 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

นี่คือเชลล์สคริปต์ที่จะทำสิ่งที่คุณต้องการสำหรับทั้ง Terminal ของ Apple หรือ iTerm (เรามีผู้ใช้ทั้งคู่)

สำหรับแท็บที่คุณเปิดสิ่งนี้จะเรียกใช้แบตช์ไฟล์อื่นในแต่ละแท็บเช่นหนึ่งสำหรับทอมแคทหนึ่งตัวสำหรับคุณ 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 แต่ไม่จำเป็นต้องเจาะจงเฉพาะโครงการของคุณ

หากต้องการตัดเรื่องสั้นให้ใช้ชื่อแทนคำสั่งให้ทำในสิ่งที่คุณต้องการหรือสร้างเชลล์สคริปต์เล็กน้อยเพื่อทำสิ่งที่คุณต้องการ

สร้างเชลล์สคริปต์ชื่อ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

อีกครั้งวางไว้ในโฟลเดอร์ถังขยะchmod 700 ~/bin/myapp.taillogจากนั้นหลังจากที่เริ่มจากเซิร์ฟเวอร์รางแล้วกดอย่างรวดเร็วtพิมพ์myapp.taillogและคุณมีไฟล์บันทึกที่จะพิมพ์

สองคำสั่งสอง keystokes เพิ่มเติม (เปิดแท็บ) อาจจะเพียงพอหรือไม่

มีการปรับปรุงสองอย่างที่ชัดเจนมากที่นี่ หนึ่งคือการเขียนฟังก์ชั่นของเชลล์ที่สามารถ "ค้นหา" ชื่อแอพพลิเคชั่นของ Rails ได้ดังนั้นคุณไม่จำเป็นต้องเขียนเชลล์สคริปสำหรับแต่ละคำสั่งการเขียนคำสั่งย่อยที่ออกแบบมาเพื่อเริ่ม webbrick / เซิร์ฟเวอร์ทางเลือกของคุณ คำสั่งสำหรับ tail -F'ing ล็อกไฟล์คีย์สองสามตัวเป็นประจำ

การปรับปรุงครั้งที่สองคือมีโอกาสที่คุณจะสามารถเขียน AppleScript ที่ทำหน้าที่เชื่อมต่อเทอร์มินัลที่จำเป็นและดำเนินการคำสั่งที่เหมาะสมภายในแต่ละรายการ แต่ตรงไปตรงมาฉันดูด AppleScript และทำงานใน bash code และ perl code ทุกวันดังนั้นฉันจึงเสนอคำแนะนำที่เกี่ยวข้องกับชุดทักษะของฉัน :)


1

แม้ว่าคุณอาจเชื่อมโยงกับเทอร์มินัลของ Apple ตามข้อความของคำถามของคุณ แต่iTermเหนือกว่าเทอร์มินัลอีมูเลเตอร์เริ่มต้นสำหรับการสร้างสคริปต์และการจัดการหน้าต่างหลายบาน

แนวคิดของบุ๊กมาร์กช่วยให้การจัดการชุดหน้าต่างง่ายขึ้น การเขียนสคริปต์ของ iTerm ใช้ AppleScript / Automater ง่ายและมีประสิทธิภาพมากขึ้นและเอกสารที่ดีขึ้นในเว็บไซต์ของผู้พัฒนา (เทียบกับเทอร์มินัล)

ตรวจสอบว่าคุณพบสคริปต์ของ terminal ปกติที่ไม่ตรงกับความต้องการของคุณ ฉันขอแนะนำให้คุณพิจารณาการปรับแต่งยูนิกซ์เชลล์ของคุณเพื่อตั้งค่านามแฝงสำหรับคำสั่งที่ใช้บ่อย คุณจะใช้มันในการเขียนสคริปต์งานเริ่มต้นสำหรับหน้าต่างใหม่ แต่เมื่อใดก็ตามที่คุณอยู่ในเชลล์และจำเป็นต้องสลับงานแทนที่จะต้องเปิดหน้าต่างใหม่


1

สคริปต์นั้นดีและใช้งานได้ทั้งหมด แต่คุณสามารถใช้ Automator เพื่อบันทึก 'Watch Me Do' ที่คุณเปิด Terminal และโยน Command + N จำนวนเล็กน้อยสำหรับหน้าต่างที่คุณต้องการ และ voila


1

มีดีคือคำตอบให้กับคำถามที่คล้ายกันมากกว่าใน StackOverflow แต่มันอาจจะเป็นมากกว่าที่นี่ในขณะนี้ดังนั้นผมจะคัดลอก / พาสต้ามันนี่


นี่เป็นไปได้อย่างแน่นอน แต่มันจะใช้เวลาในการทำงานในส่วนของคุณ สิ่งแรกที่คุณต้องมีคือการตั้งค่าแต่ละหน้าต่าง / แท็บที่คุณต้องการในการตั้งค่าของคุณ

ฉันมี 4 แท็บที่เปิดอัตโนมัติทุกครั้งที่เปิด Terminal DB Shell, Editor, และServer Shellทั้งหมดนี้อยู่ในโครงการSasquatch(ไม่ต้องถาม) ดังนั้นการตั้งชื่อ แต่ละเหล่านี้ควรมีคำสั่งเฉพาะที่เกี่ยวข้องกับพวกเขา

vimในกรณีนี้ผมกำลังดำเนินการ vim ~/projects/main/หากคุณเกิดขึ้นจะมีไดเรกทอรีที่เฉพาะเจาะจงที่คุณต้องการที่จะเริ่มต้นในคุณสามารถใช้สิ่งที่ต้องการ สิ่งที่คุณต้องการเข้าไปมีคำสั่งที่เชลล์จะทำงานเมื่อมันเปิดขึ้น ตอนนี้คุณต้องเปิดหน้าต่าง / แท็บทั้งหมด:

  1. ปิดทุกอย่าง
  2. เปิดหน้าต่างใหม่สำหรับแต่ละโปรไฟล์ของคุณ
    • ไปที่Shellเมนู => New Tab/ New Window=> เลือกโปรไฟล์ที่คุณสร้างไว้ด้านบน
    • ทำซ้ำสำหรับแต่ละหน้าต่างหรือแท็บที่คุณต้องการ
  3. เมื่อคุณเปิดหน้าต่างและ / หรือแท็บทั้งหมดไว้ให้บันทึกเป็นหน้าต่างกลุ่ม
    • ไปที่Windowเมนู Save Window As Group...=>
    • ตั้งชื่อกลุ่ม Window ของคุณ (ซึ่งจะมีประโยชน์ในภายหลัง)
    • หากคุณต้องการให้กลุ่มนี้เปิดทุกครั้งที่คุณเปิด Terminal ให้ทำเครื่องหมายในช่องที่ด้านล่างของหน้าจอนี้แล้วกดบันทึก
  4. ปิด Windows / แท็บทั้งหมดของคุณ (เวลาทดสอบ!)
  5. เปิดกลุ่มหน้าต่างใหม่ของคุณ
    • ไปที่Windowเมนู => Open Window Group=> เลือกกลุ่มที่คุณเพิ่งสร้าง

สิ่งนี้จะปรากฏขึ้นหน้าต่างทั้งหมดที่คุณเพิ่งมีในตำแหน่งเดียวกัน แต่ละคำสั่งที่คุณตั้งขึ้นในปีSettingsควรได้รับการเปิดตัวในแท็บของตน


1
เพียงแค่ทราบลิงค์ภาพ Imageshack ในคำตอบของคุณดูเหมือนจะขาด
เที่ยว

น่าเสียดายที่ฉันไม่มีภาพหรือไฟล์การตั้งค่าเก่าเพื่อสร้างใหม่อีกครั้ง = - [
Jack M.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.