Aprire un nuovo terminale dalla riga di comando ed eseguire un comando su Mac OS X?


24

C'è un modo per aprire un nuovo terminale dalla riga di comando ed eseguire un comando su quel nuovo terminale (su un Mac)?

ad es. qualcosa del tipo:

Terminal -e ls

dove lsviene eseguito nel nuovo terminale.


Sto cercando di capire come eseguire un ruby ​​sul server rails in un nuovo terminale, usando 1 comando.
zlog,

Sembra ragionevole - suppongo che desideri che lo stdout appaia nel terminale aperto. In tal caso, sì, vuoi scrivere uno script di shell che faccia il lavoro che vuoi, e poi cambiare la sua estensione in .command, come di seguito.
Norman Grey,

Risposte:


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

Questo apre un nuovo terminale ed esegue il comando "ciao eco" al suo interno.


Sono sicuro che questo sia ovvio per un esperto di applecript ma che ne dici di un esempio che avvia un programma? Fondamentalmente come posso fare 'xterm -e somecomnand'
gman

3
Questo può essere leggermente più breve:osascript -e 'tell app "Terminal" to do script "echo hello"'
joemaller

1
come impostare la nuova finestra del terminale in alto attiva?
Jenkamen,

E come posso passare argomenti lungo le righe di "$@"in shell ma in script osa?
Rednoah,

3

Puoi farlo in una rotonda:

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

Gli script Shell che hanno l'estensione .commande sono eseguibili, possono essere cliccati due volte per essere eseguiti all'interno di una nuova finestra Terminale. Il comando open, come probabilmente saprai, equivale a fare doppio clic su un oggetto Finder, quindi questa procedura finisce per eseguire i comandi nello script all'interno di una nuova finestra Terminale.

Leggermente contorto, ma sembra funzionare. Sono sicuro che ci deve essere un percorso più diretto per questo (che cosa stai effettivamente cercando di fare?), Ma mi sfugge in questo momento.


Ho provato questo e si apre un nuovo terminale, ma poi ottengo: ~ $ /Users/username/Work/Dev/scripts/hello.command; Uscita; logout [Processo completato] Questo è il mio hello.command: script $ cat hello.command #! / bin / sh
saluta

Ack, non è stato formattato correttamente, ma penso che tu abbia avuto l'idea.
zlog,

@zlog: ma ha detto 'ciao', sì? Nelle preferenze di Terminal.app, vedi le "Impostazioni" e la scheda "Shell" al suo interno. Vedrai un menu "Quando la shell esce:". Penso che il valore predefinito sia "Non chiudere la finestra", ed è quello che stai vedendo. Se lo si modifica in "Chiudi se la shell è uscita in modo pulito", al termine dello script della shell la finestra del terminale dovrebbe scomparire.
Norman Gray,

Posso eseguire il comando per lasciare aperta la sessione e non disconnettermi?
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

Hai bisogno di ruby ​​1.9 o dovrai aggiungere la linea require 'rubygems'prima che gli altri lo richiedano e non dimenticare di installare gem rb-appscript.

Ho chiamato questo script dt(scheda dup), quindi posso semplicemente eseguire dtper aprire la scheda nella stessa cartella o dt lsper eseguire anche il lscomando lì .


2

Funziona, almeno sotto Mountain Lion. Inizializza ogni volta una shell interattiva, sebbene sia possibile sostituirla dopo averla invocata come "macterm exec your-command ". Conservalo in bin / macterm nella tua home directory e 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

Lo farei con AppleScript. Puoi ottimizzarlo utilizzando il comando osascript. La tua sceneggiatura sarebbe simile a:

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

Se accederai al terminale solo nel terminale, puoi omettere tutto tranne la dichiarazione tell centrale. Se si desidera una nuova finestra anziché una nuova scheda, sostituire la sequenza di tasti t con n.

Non sono abbastanza esperto AppleScripter per sapere come ottenere argomenti da riga di comando e quindi digitarli nuovamente nella nuova finestra, ma sono sicuro che sia possibile e non troppo difficile.

Inoltre, penso che funzioni e non sono in grado di testare ora, ma sono abbastanza sicuro che puoi avviare uno script di shell con qualche variante su #! / Usr / bin / osascript -e e quindi salvarlo come eseguibile Comunque tu voglia. Che, almeno nella mia testa, ti renderebbe possibile digitare qualcosa come $ runinnewterm ls / Applicazioni

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.