Открыть новый терминал из командной строки и запустить команду в Mac OS X?

24

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

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

Terminal -e ls

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

zlog
источник
Я пытаюсь выяснить, как запустить ruby ​​на сервере rails в новом терминале, используя 1 команду.
zlog
Это звучит разумно - я так понимаю, вы хотите, чтобы стандартный вывод появился в открытом терминале. В этом случае, да, вы хотите написать сценарий оболочки, который выполняет ту работу, которую вы хотите, а затем изменить его расширение на .command, как показано ниже.
Норман Грей,

Ответы:

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

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

лак
источник
Я уверен, что это очевидно для специалиста по appleScript, но как насчет примера, запускающего любую программу? По сути, я могу сделать 'xterm -e somecomnand'
gman
3
Это может быть немного короче:osascript -e 'tell app "Terminal" to do script "echo hello"'
joemaller
1
как установить новую верхнюю часть окна терминала активным?
Jenkamen
И как я могу передать аргументы вдоль строк "$@"в оболочке, но в сценарии osa?
Rednoah
3

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

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

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

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

Норман грей
источник
Я попробовал это, и новый терминал открывается, но затем я получаю: ~ $ /Users/username/Work/Dev/scripts/hello.command; выход; Выйти [процесс завершен] Это мой hello.command: скрипты $ cat hello.command #! / bin / sh - поздороваться
zlog
Ок, это не отформатировало должным образом, но я думаю, вы поняли идею.
zlog
@zlog: но он сказал «привет», да? В настройках Terminal.app см. «Настройки» и вкладку «Оболочка». Вы увидите меню «Когда оболочка выйдет:». Я думаю, что по умолчанию «Не закрывать окно», и это то, что вы видите. Если вы измените это на «Закрыть, если оболочка завершена чисто», окно терминала должно исчезнуть после завершения сценария оболочки.
Норман Грей
Могу ли я сделать команду оставить сеанс открытым и не выходить из системы?
Рой
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

Это работает, по крайней мере, под 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 
Bluby
источник
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

NReilingh
источник