23

Есть ли способ открыть новый терминал из командной строки и запустить команду на этом новом терминале (на Mac)?

например, что-то вроде:

Terminal -e ls

где ls запускается в новом терминале.

5 ответов5

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

Это открывает новый терминал и выполняет команду "эхо привет" внутри него.

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

Вам нужен ruby 1.9, или вам нужно добавить строку, require 'rubygems' прежде чем другие захотят, и не забудьте установить gem rb-appscript .

Я назвал этот скрипт dt (dup tab), поэтому я могу просто запустить dt чтобы открыть вкладку в той же папке, или dt ls чтобы также запустить там команду ls .

2

Вы можете сделать это окольным путем:

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

Сценарии оболочки, имеющие расширение .command и выполняемые, можно дважды щелкнуть для запуска в новом окне терминала. Команда open , как вы, вероятно, знаете, эквивалентна двойному щелчку по объекту Finder, поэтому эта процедура завершается выполнением команд в сценарии в новом окне терминала.

Немного искривлено, но это, кажется, работает. Я уверен, что должен быть более прямой путь к этому (что вы на самом деле пытаетесь сделать?), Но это ускользает от меня прямо сейчас.

0

Это работает, по крайней мере, под Mountain Lion. Он каждый раз инициализирует интерактивную оболочку, хотя вы можете заменить ее после ее завершения, вызвав ее как «macterm exec your-command ». Сохраните это в bin/macterm в вашем домашнем каталоге и выполните команду 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

Я бы сделал это с AppleScript. Вы можете оптимизировать его с помощью команды osascript. Ваш сценарий будет что-то вроде:

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

Если вы собираетесь получить к нему доступ только через терминал, тогда вы можете опустить все, кроме среднего оператора Tell. Если вы хотите новое окно вместо новой вкладки, замените нажатие клавиши t на n.

Я не достаточно опытный AppleScripter, чтобы знать, как получить аргументы командной строки, а затем перепечатать их в новом окне, но я уверен, что это возможно и не слишком сложно.

Кроме того, я думаю , что это работает, и я не могу сейчас тестировать, но я почти уверен, что вы можете запустить сценарий оболочки с некоторым вариантом на #!/usr/bin/osascript -e, а затем сохраните его как исполняемый файл, как вы хотите. Что, по крайней мере, в моей голове, позволило бы вам напечатать что-то вроде $ runinnewterm ls /Applications

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .