Mở một thiết bị đầu cuối mới từ dòng lệnh và chạy lệnh trên Mac OS X?


24

Có cách nào để mở một thiết bị đầu cuối mới từ dòng lệnh và chạy một lệnh trên thiết bị đầu cuối mới đó (trên máy Mac) không?

ví dụ: Một cái gì đó như:

Terminal -e ls

nơi lsđược chạy trong thiết bị đầu cuối mới.


Tôi đang cố gắng tìm ra cách chạy một viên ruby ​​trên máy chủ rails trong một thiết bị đầu cuối mới, sử dụng 1 lệnh.
zlog

Điều đó nghe có vẻ hợp lý - Tôi cho rằng bạn muốn thiết bị xuất chuẩn xuất hiện trong thiết bị đầu cuối đã mở. Trong trường hợp đó, vâng, bạn muốn viết một tập lệnh shell thực hiện công việc bạn muốn, sau đó thay đổi phần mở rộng của nó thành .command, như dưới đây.
Norman Gray

Câu trả lời:


24
osascript -e 'tell app "Terminal"
    do script "echo hello"
end tell'

Điều này sẽ mở ra một thiết bị đầu cuối mới và thực hiện lệnh "echo hello" bên trong nó.


Tôi chắc chắn điều này rõ ràng với một chuyên gia về applescript nhưng làm thế nào về một ví dụ khởi chạy bất kỳ chương trình nào? Về cơ bản như tôi có thể làm 'xterm -e somecomnand'
gman

3
Điều này có thể ngắn hơn một chút:osascript -e 'tell app "Terminal" to do script "echo hello"'
joemaller

1
Làm thế nào để thiết lập cửa sổ đầu cuối mới hoạt động hàng đầu?
Jenkamen

Và làm cách nào để chuyển các đối số dọc theo các dòng "$@"trong shell nhưng trong tập lệnh osa?
rednoah

3

Bạn có thể làm điều đó theo cách vòng vo:

% cat /tmp/hello.command
#! /bin/sh -
say hello
% chmod +x /tmp/hello.command
% open /tmp/hello.command

Các tập lệnh Shell có phần mở rộng .commandvà có thể thực thi được, có thể nhấp đúp vào để chạy bên trong cửa sổ Terminal mới. Lệnh open, như bạn có thể biết, tương đương với nhấp đúp vào đối tượng Finder, vì vậy quy trình này kết thúc bằng cách chạy các lệnh trong tập lệnh trong cửa sổ Terminal mới.

Hơi xoắn, nhưng nó có vẻ hoạt động. Tôi cảm thấy chắc chắn phải có một con đường trực tiếp hơn đến đây (bạn thực sự đang cố gắng làm gì?), Nhưng nó thoát khỏi tôi ngay bây giờ.


Tôi đã thử điều này và một thiết bị đầu cuối mới mở ra, nhưng sau đó tôi nhận được: ~ $ /Users/username/Work/Dev/scripts/hello.command; lối thoát hiểm; đăng xuất [Quá trình hoàn tất] Đây là hello.command của tôi: scripts $ cat hello.command #! / bin / sh - nói xin chào
zlog

Ack, điều đó không đúng định dạng, nhưng tôi nghĩ bạn hiểu ý.
zlog

@zlog: nhưng nó đã nói 'xin chào', đúng chứ? Trong tùy chọn của Terminal.app, hãy xem tab 'Cài đặt' và tab 'Shell' trong đó. Bạn sẽ thấy một menu 'Khi vỏ thoát ra:'. Tôi nghĩ mặc định là 'Đừng đóng cửa sổ' và đó là những gì bạn đang thấy. Nếu bạn thay đổi điều này thành 'Đóng nếu trình bao thoát hoàn toàn', cửa sổ đầu cuối sẽ biến mất sau khi tập lệnh shell kết thúc.
Norman Gray

Tôi có thể thực hiện lệnh để mở phiên của nó và không đăng xuất không?
Royi

2
#!/usr/bin/env ruby1.9

require 'shellwords'
require 'appscript'

class Terminal
  include Appscript
  attr_reader :terminal, :current_window
  def initialize
    @terminal = app('Terminal')
    @current_window = terminal.windows.first
    yield self
  end

  def tab(dir, command = nil)
    app('System Events').application_processes['Terminal.app'].keystroke('t', :using => :command_down)
    cd_and_run dir, command
  end

  def cd_and_run(dir, command = nil)
    run "clear; cd #{dir.shellescape}"
    run command
  end

  def run(command)
    command = command.shelljoin if command.is_a?(Array)
    if command && !command.empty?
      terminal.do_script(command, :in => current_window.tabs.last)
    end
  end
end

Terminal.new do |t|
  t.tab Dir.pwd, ARGV.length == 1 ? ARGV.first : ARGV
end

Bạn cần ruby ​​1.9 hoặc bạn sẽ cần thêm dòng require 'rubygems'trước khi người khác yêu cầu và đừng quên cài đặt gem rb-appscript.

Tôi đặt tên cho tập lệnh này dt(tab kép), vì vậy tôi chỉ có thể chạy dtđể mở tab trong cùng thư mục hoặc dt lschạy lslệnh đó .


2

Điều này hoạt động, ít nhất là dưới Mountain Lion. Nó sẽ khởi tạo một lớp vỏ tương tác mỗi lần, mặc dù bạn có thể thay thế nó sau khi thực tế bằng cách gọi nó là "vi khuẩn thực thi lệnh của bạn ". Lưu trữ này trong bin / macterm trong thư mục nhà của bạn và chmod a + x bin / macterm:

#!/usr/bin/osascript

on run argv
   tell app "Terminal" 
   set AppleScript's text item delimiters to " "
        do script argv as string
        end tell   
end run 

0

Tôi sẽ làm điều này với AppleScript. Bạn có thể hợp lý hóa nó bằng cách sử dụng lệnh osascript. Kịch bản của bạn sẽ giống như:

tell application "Terminal"
  activate
  tell application "System Events"
    keystroke "t" using {command down}
  end tell
end tell

Nếu bạn chỉ truy cập nó trong thiết bị đầu cuối, thì bạn có thể bỏ qua tất cả trừ câu lệnh trung gian. Nếu bạn muốn có một cửa sổ mới thay vì một tab mới, hãy thay thế tổ hợp phím t bằng n.

Tôi không phải là một AppleScripter đủ kinh nghiệm để biết cách lấy các đối số dòng lệnh và sau đó nhập lại chúng trong cửa sổ mới, nhưng tôi chắc chắn rằng điều đó là có thể và không quá khó.

Ngoài ra, tôi nghĩ rằng điều này hoạt động và tôi không thể kiểm tra ngay bây giờ, nhưng tôi khá chắc chắn rằng bạn có thể bắt đầu một tập lệnh shell với một số biến thể trên #! / Usr / bin / osascript -e và sau đó lưu nó dưới dạng thực thi tuy nhiên bạn muốn Mà, ít nhất là trong đầu tôi, sẽ giúp bạn có thể gõ một cái gì đó như $ runinnewterm ls / Ứng dụng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.