Câu hỏi Sử dụng Automator để mở tập lệnh shell, xem đầu ra trong terminal


Tôi có một vấn đề nhỏ thú vị, chạy trên Mac OS X 10.8 Mountain Lion.

Tôi có một kịch bản (WebKit's run-safari) khởi chạy Safari ở chế độ dev (nó đặt một số biến môi trường và sau đó chạy arch -x86_64 /Applications/Safari/Contents/MacOS/SafariForWebKitDevelopment).

Tôi muốn cải thiện kịch bản này theo các cách sau:

  • Tôi muốn tạo một lối tắt có thể nhấp đúp, biểu tượng đẹp đến nó
  • Tôi muốn nó mang Safari đến nền trước khi chạy (hiện tại đang chạy lệnh thoát khỏi Terminal ở nền trước và Safari trong nền)
  • Tôi muốn có thể nhìn thấy stdout từ lệnh SafariForWebKitDevelopment trong cửa sổ đầu cuối
  • Nếu có thể, tôi muốn cửa sổ Terminal đóng khi Safari đóng lại.

Tôi đã có thể nhận được bất kỳ hai trong số ba của những người bằng cách kết hợp tự động hóa, AppleScript và bash script, nhưng không phải tất cả ba. Có ai có bất kỳ con trỏ ở đây?


3
2017-11-06 07:12


gốc


Nếu bạn lưu tệp AppleScript dưới dạng .scpt bạn có thể chỉ cần nhấp đúp vào nó. Bạn cũng có thể quấn nó bên trong ứng dụng Automator. Bạn có kịch bản gì cho đến nay? - slhck
Tôi không biết tại sao tôi không nghĩ về điều đó trước đây. Tôi đã tạo một AppleScript để khởi chạy một cửa sổ dòng lệnh mới và thực thi lệnh run-safari trong đó. Đăng nó dưới đây. Cảm ơn sự thấu hiểu! - int3h


Các câu trả lời:


Theo gợi ý của slhck, tôi đã tạo một AppleScript độc lập hoàn thành nhiệm vụ này, sau đó lưu nó trong tiện ích trình soạn thảo AppleScript dưới dạng .app. Nó thực hiện chính xác những gì tôi muốn.

Dưới đây, tìm kịch bản. Nó sẽ kiểm tra xem SafariForWebKitDevelopment có đang chạy hay không, yêu cầu Terminal chạy một kịch bản để khởi động nó nếu cần thiết. (Điều này sẽ tự động tạo một cửa sổ mới, và tôi thiết lập các thiết lập cửa sổ Terminal mới mặc định của chúng ta để đóng một cửa sổ khi quá trình của nó thoát.) Sau đó, nó đặt quá trình đó là cửa sổ trên cùng.

Tôi đã đi trên một cuộc săn đuổi ngỗng hoang dã cố gắng tìm ra cách xử lý trường hợp Safari thường xuyên chạy cùng lúc với SafariForWebKitDevelopment, và cuối cùng đến giải pháp bạn thấy trong mã, làm việc với các tiến trình chứ không phải là các ứng dụng.

tell application "System Events"
    -- Only launch development Safari if it isn't already running
    if not (exists process "SafariForWebKitDevelopment") then
        tell application "Terminal"
            do script "run-safari; exit"
            activate
        end tell
    end if

    -- Max number of iterations of checking for process before
    -- we give up and exit the script (guards against errors in
    -- launching SafariForWebKitDevelopment, where the process
    -- would never exist, and this would be an infinite loop)
    set num_checks to 100
    -- Wait until dev Safari has launched
    repeat until (exists process "SafariForWebKitDevelopment")
        delay 0.1

        set num_checks to num_checks - 1
        if num_checks < 0 then
            return
        end if
    end repeat

    -- Set dev Safari to have focus
    -- 'tell application "Safari" to activate' doesn't work because AppleScript 
    -- has no way of discerning between multiple processes from the same .app
    -- bundle, so we can't be sure if we're talking to
    -- SafariForWebKitDevelopment, or an already-running normal Safari

    set frontmost of (process "SafariForWebKitDevelopment") to true
end tell

3
2017-11-07 12:51