Otwieranie nowego terminala z wiersza poleceń i uruchamianie polecenia w systemie Mac OS X?

22

Czy istnieje sposób na otwarcie nowego terminala z wiersza poleceń i uruchomienie polecenia na tym nowym terminalu (na komputerze Mac)?

np. coś takiego:

Terminal -e ls

gdzie ls jest uruchamiany w nowym terminalu.

zlog
źródło
Próbuję dowiedzieć się, jak uruchomić ruby ​​na serwerze railsowym w nowym terminalu, używając polecenia 1.
zlog
To brzmi rozsądnie - uważam, że chcesz, aby stdout pojawił się w otwartym terminalu. W takim przypadku tak, chcesz napisać skrypt powłoki, który wykona żądaną pracę, a następnie zmień jego rozszerzenie na polecenie, jak poniżej.
Norman Gray

Odpowiedzi:

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

Otwiera to nowy terminal i wykonuje w nim polecenie „echo hello”.

LaC
źródło
Jestem pewien, że jest to oczywiste dla eksperta od Applecript, ale co z przykładem, który uruchamia dowolny program? Zasadniczo mogę zrobić „xterm -e somecomnand”
gman
3
Może to być nieco krótsze: osascript -e 'tell app "Terminal" to do script "echo hello"'
joemaller
jak ustawić aktywne nowe okno terminala?
Jenkamen
2

Możesz to zrobić okrężną drogą:

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

Skrypty powłoki z rozszerzeniem .command i które są wykonywalne, można kliknąć dwukrotnie, aby uruchomić w nowym oknie terminala. Komenda open, jak zapewne wiesz, jest równoważne dwukrotnemu kliknięciu obiektu Finder, więc ta procedura kończy wykonywanie poleceń w skrypcie w nowym oknie terminala.

Lekko skręcone, ale wydaje się działać. Jestem tam pewien musi być bardziej bezpośrednią drogą do tego (co właściwie próbujesz zrobić?), ale ucieka mi teraz.

Norman Gray
źródło
Próbowałem tego i otwiera się nowy terminal, ale potem otrzymuję: ~ $ /Users/username/Work/Dev/scripts/hello.command; wyjście; logout [Proces zakończony] To jest moja hello.command: scripts $ cat hello.command #! / bin / sh - powiedz cześć
zlog
Ack, który nie sformatował się poprawnie, ale myślę, że masz pomysł.
zlog
@zlog: ale powiedział „cześć”, tak? W preferencjach Terminal.app zobacz zakładkę „Ustawienia” i „Powłoka” w tym polu. Zobaczysz menu „Po zamknięciu powłoki:”. Myślę, że domyślnie jest to „Nie zamykaj okna” i to właśnie widzisz. Jeśli zmienisz to na „Zamknij, jeśli powłoka wyszła czysto”, okno terminalu powinno zniknąć po zakończeniu skryptu powłoki.
Norman Gray
Czy mogę wydać polecenie, aby pozostawić otwartą sesję i nie wylogować się?
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

Potrzebujesz ruby ​​1.9 lub musisz dodać linię require 'rubygems' przed innymi wymaga i nie zapomnij zainstalować gem rb-appscript.

Nazwałem ten skrypt dt (zakładka dup), więc mogę po prostu uruchomić dt aby otworzyć kartę w tym samym folderze lub dt ls także tam biegać ls dowództwo.

tig
źródło
0

Zrobiłbym to za pomocą AppleScript. Możesz go usprawnić za pomocą polecenia osascript. Twój skrypt będzie wyglądał następująco:

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

Jeśli masz zamiar uzyskać do niego dostęp tylko w terminalu, możesz pominąć wszystkie instrukcje z wyjątkiem tell. Jeśli chcesz nowe okno zamiast nowej karty, zastąp klawisz t klawiszem n.

Nie jestem wystarczająco doświadczony w AppleScripter, aby wiedzieć, jak uzyskać argumenty wiersza poleceń, a następnie wpisać je w nowym oknie, ale jestem pewien, że jest to możliwe i nie jest zbyt trudne.

Również ja myśleć to działa i nie jestem w stanie przetestować teraz, ale jestem pewien, że możesz uruchomić skrypt powłoki z pewnym wariantem na #! / usr / bin / osascript -e, a następnie zapisać go jako plik wykonywalny, jak chcesz. Co, przynajmniej w mojej głowie, umożliwiłoby ci wpisanie czegoś takiego jak $ runinnewterm ls / Applications

NReilingh
źródło
0

To działa, przynajmniej pod Mountain Lion. Inicjuje powłokę interaktywną za każdym razem, chociaż można ją zastąpić faktem, wywołując ją jako „exec macterm twoje polecenie ". Zapisz to w bin / macterm w twoim katalogu domowym i 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
źródło