¿Abrir un nuevo terminal desde la línea de comandos y ejecutar un comando en Mac OS X?

24

¿Hay alguna manera de abrir un nuevo terminal desde la línea de comandos y ejecutar un comando en ese nuevo terminal (en una Mac)?

por ejemplo, algo como:

Terminal -e ls

donde lsse ejecuta en la nueva terminal.

zlog
fuente
Estoy tratando de descubrir cómo ejecutar un servidor ruby ​​on rails en una nueva terminal, usando 1 comando.
zlog
Eso suena razonable: supongo que desea que la stdout aparezca en la terminal abierta. En ese caso, sí, desea escribir un script de shell que haga el trabajo que desea y luego cambiar su extensión a .command, como se muestra a continuación.
Norman Gray

Respuestas:

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

Esto abre un nuevo terminal y ejecuta el comando "echo hello" dentro de él.

Laca
fuente
Estoy seguro de que esto es obvio para un experto en AppleScript, pero ¿qué tal un ejemplo que lanza cualquier programa? Básicamente, como puedo hacer 'xterm -e somecomnand'
gman
3
Esto puede ser un poco más corto:osascript -e 'tell app "Terminal" to do script "echo hello"'
joemaller
1
¿Cómo configurar la nueva ventana de terminal superior activa?
Jenkamen
¿Y cómo paso argumentos a lo largo de las líneas de "$@"in shell pero en osa script?
Rednoah
3

Puedes hacerlo de forma indirecta:

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

.commandSe puede hacer doble clic en los scripts de shell que tienen la extensión y que son ejecutables para ejecutarse dentro de una nueva ventana de Terminal. El comando open, como probablemente sepa, es equivalente a hacer doble clic en un objeto Finder, por lo que este procedimiento termina ejecutando los comandos en el script dentro de una nueva ventana de Terminal.

Ligeramente retorcido, pero parece funcionar. Estoy seguro de que debe haber una ruta más directa hacia esto (¿qué es lo que realmente estás tratando de hacer?), Pero ahora se me escapa.

Gris normando
fuente
Intenté esto y se abre una nueva terminal, pero luego obtengo: ~ $ /Users/username/Work/Dev/scripts/hello.command; salida; cerrar sesión [Proceso completado] Este es mi hello.command: scripts $ cat hello.command #! / bin / sh - hola
zlog
Ack, eso no se formateó correctamente, pero creo que entiendes la idea.
zlog
@zlog: pero dijo 'hola', ¿sí? En las preferencias de Terminal.app, consulte la pestaña 'Configuración' y 'Shell' dentro de eso. Verá un menú 'Cuando sale el shell:'. Creo que el valor predeterminado es 'No cierre la ventana', y eso es lo que está viendo. Si cambia esto a 'Cerrar si el shell salió limpiamente', la ventana del terminal debería desaparecer una vez que finalice el script del shell.
Norman Gray
¿Puedo hacer un comando para dejar abierta su sesión y no cerrar sesión?
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

Necesita ruby ​​1.9 o deberá agregar una línea require 'rubygems'antes de que otros lo requieran y no olvide instalar gem rb-appscript.

Llamé a este script dt(pestaña doble), por lo que solo puedo ejecutar dtpara abrir la pestaña en la misma carpeta o dt lstambién ejecutar el lscomando.

tig
fuente
2

Esto funciona, al menos bajo Mountain Lion. Inicializa un shell interactivo cada vez, aunque puede reemplazarlo luego de invocarlo como "macterm exec your-command ". Almacene esto en bin / macterm en su directorio de inicio y 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
fuente
0

Haría esto con AppleScript. Puede simplificarlo utilizando el comando osascript. Su guión sería algo como:

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

Si solo va a acceder a él en la terminal, puede omitir todo menos la declaración de información intermedia. Si desea una nueva ventana en lugar de una nueva pestaña, reemplace la tecla t con n.

No soy un AppleScripter con suficiente experiencia para saber cómo obtener argumentos de línea de comandos y luego volver a escribirlos en la nueva ventana, pero estoy seguro de que es posible y no demasiado difícil.

Además, creo que esto funciona y no puedo probarlo en este momento, pero estoy bastante seguro de que puede iniciar un script de shell con alguna variante en #! / Usr / bin / osascript -e y luego guardarlo como un ejecutable como tú quieras. Lo cual, al menos en mi cabeza, le permitiría escribir algo como $ runinnewterm ls / Applications

NReilingh
fuente