Öffnen eines neuen Terminals über die Befehlszeile und Ausführen eines Befehls unter Mac OS X?

24

Gibt es eine Möglichkeit, ein neues Terminal über die Befehlszeile zu öffnen und einen Befehl auf diesem neuen Terminal auszuführen (auf einem Mac)?

zB Etwas wie:

Terminal -e ls

wo lswird im neuen terminal gefahren.

zlog
quelle
Ich versuche herauszufinden, wie ein Ruby-on-Rails-Server in einem neuen Terminal mit dem Befehl 1 ausgeführt wird.
zlog
Das klingt vernünftig - ich nehme an, Sie möchten, dass die Standardausgabe im geöffneten Terminal angezeigt wird. In diesem Fall möchten Sie ein Shell-Skript schreiben, das die gewünschte Arbeit leistet, und dann die Erweiterung in ".command" ändern (siehe unten).
Norman Gray

Antworten:

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

Dies öffnet ein neues Terminal und führt darin den Befehl "hallo echo" aus.

LaC
quelle
Ich bin mir sicher, dass dies für einen AppleScript-Experten offensichtlich ist, aber wie wäre es mit einem Beispiel, das ein Programm startet? Grundsätzlich kann ich 'xterm -e somecomnand' machen
gman
3
Dies kann etwas kürzer sein:osascript -e 'tell app "Terminal" to do script "echo hello"'
Joemaller
1
Wie setze ich ein neues Terminalfenster oben aktiv?
Jenkamen
Und wie gebe ich Argumente weiter, die "$@"in Shell, aber in OSA-Schrift geschrieben sind?
Rednoah
3

Sie können es auf Umwegen tun:

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

Shell-Skripte, die die Erweiterung haben .commandund ausführbar sind, können durch Doppelklicken in einem neuen Terminal-Fenster ausgeführt werden. Der Befehl entspricht open, wie Sie wahrscheinlich wissen, einem Doppelklick auf ein Finder-Objekt, sodass bei dieser Prozedur die Befehle im Skript in einem neuen Terminalfenster ausgeführt werden.

Leicht verdreht, aber es scheint zu funktionieren. Ich bin mir sicher, dass es einen direkteren Weg dazu geben muss (was versuchen Sie eigentlich?), Aber es entgeht mir im Moment.

Norman Gray
quelle
Ich habe es versucht und ein neues Terminal wird geöffnet, aber dann erhalte ich: ~ $ /Users/username/Work/Dev/scripts/hello.command; Ausfahrt; logout [Vorgang abgeschlossen] Dies ist mein hello.command: scripts $ cat hello.command #! / bin / sh - sag hallo
zlog
Ack, das hat nicht richtig formatiert, aber ich denke, Sie haben die Idee.
zlog
@zlog: aber es hat gesagt "Hallo", ja? In den Einstellungen von Terminal.app finden Sie die "Einstellungen" und die Registerkarte "Shell". Sie sehen ein Menü 'Wenn die Shell beendet wird:'. Ich denke, die Standardeinstellung ist "Fenster nicht schließen", und genau das sehen Sie. Wenn Sie dies in "Schließen, wenn die Shell ordnungsgemäß beendet wurde" ändern, sollte das Terminalfenster ausgeblendet werden, sobald das Shell-Skript beendet ist.
Norman Gray
Kann ich befehlen, die Sitzung offen zu lassen und mich nicht abzumelden?
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

Sie benötigen Ruby 1.9, oder Sie müssen eine Zeile hinzufügen, require 'rubygems'bevor andere dies erfordern, und die Installation nicht vergessen gem rb-appscript.

Ich habe dieses Skript dt(dup tab) so benannt, dass ich es einfach ausführen kann dt, um die Registerkarte in demselben Ordner zu öffnen oder dt lsum dort den lsBefehl auszuführen .

tig
quelle
2

Dies funktioniert zumindest unter Mountain Lion. Es wird jedes Mal eine interaktive Shell initialisiert, obwohl Sie diese nachträglich ersetzen können, indem Sie sie als "macterm exec your-command " aufrufen . Speichern Sie dies in bin / macterm in Ihrem Home-Verzeichnis und 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
quelle
0

Ich würde das mit AppleScript machen. Sie können es mit dem Befehl osascript optimieren. Ihr Skript würde ungefähr so ​​aussehen:

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

Wenn Sie nur im Terminal darauf zugreifen, können Sie alle Anweisungen außer der mittleren tell-Anweisung weglassen. Wenn Sie ein neues Fenster anstelle einer neuen Registerkarte möchten, ersetzen Sie den t-Tastenanschlag durch n.

Ich bin kein erfahrener AppleScripter, der weiß, wie man Befehlszeilenargumente abruft und sie dann im neuen Fenster erneut eingibt, aber ich bin sicher, dass dies möglich und nicht allzu schwierig ist.

Ich denke auch, dass dies funktioniert und ich kann es momentan nicht testen, aber ich bin mir ziemlich sicher, dass Sie ein Shell-Skript mit einer Variante von #! / Usr / bin / osascript -e starten und es dann als ausführbare Datei speichern können wie auch immer du willst. Zumindest in meinem Kopf würde das es Ihnen ermöglichen, so etwas wie $ runinnewterm ls / Applications einzugeben

NReilingh
quelle