Відкрити новий термінал з командного рядка та запустити команду на Mac OS X?


24

Чи є спосіб відкрити новий термінал з командного рядка та виконати команду на цьому новому терміналі (на Mac)?

наприклад, щось на кшталт:

Terminal -e ls

де lsзапускається в новому терміналі.


Я намагаюся розібратися, як запустити рубін на сервер рейлів в новому терміналі, використовуючи 1 команду.
zlog

Це звучить розумно - я вважаю, що ви хочете, щоб stdout з'явився у відкритому терміналі. У такому випадку, так, ви хочете написати сценарій оболонки, який виконує потрібну роботу, а потім змінити його розширення на .command, як показано нижче.
Норман Грей

Відповіді:


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

Це відкриває новий термінал і виконує команду "echo hello" всередині нього.


Я впевнений, що це очевидно для експерта з яблучного сценарію, але як щодо прикладу, який запускає будь-яку програму? В основному, як я можу зробити "xterm -e somecomnand"
gman

3
Це може бути трохи коротше:osascript -e 'tell app "Terminal" to do script "echo hello"'
joemaller

1
як встановити нове вікно терміналу вгорі активно?
Jenkamen

І як я можу передавати аргументи в рядку "$@"оболонки, але в сценарії osa?
регулярah

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

Вам потрібен рубін 1.9, або вам потрібно буде додати рядок require 'rubygems'до того, як вимагають інші, і не забудьте встановити gem rb-appscript.

Я назвав цей скрипт dt(вкладка dup), тому я можу просто запустити, dtщоб відкрити вкладку в тій же папці або dt lsтакож запустити lsкоманду там .


2

Це працює, принаймні під гірським левом. Він ініціалізує інтерактивну оболонку кожен раз, хоча ви можете замінити цей факт після виходу, посилаючись на нього як "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

Якщо ви збираєтесь отримувати доступ до нього лише в терміналі, тоді ви можете опустити все, окрім середньої заяви. Якщо ви хочете нове вікно замість нової вкладки, замініть клавішу t на n.

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.