Ouvrir un nouveau terminal à partir de la ligne de commande et exécuter une commande sur Mac OS X?

24

Existe-t-il un moyen d'ouvrir un nouveau terminal à partir de la ligne de commande et d'exécuter une commande sur ce nouveau terminal (sur un Mac)?

par exemple, quelque chose comme:

Terminal -e ls

lsest exécuté dans le nouveau terminal.

zlog
la source
J'essaie de comprendre comment exécuter un serveur ruby ​​on rails dans un nouveau terminal, en utilisant 1 commande.
zlog
Cela semble raisonnable - je suppose que vous souhaitez que la sortie standard apparaisse dans le terminal ouvert. Dans ce cas, oui, vous voulez écrire un script shell qui fait le travail que vous voulez, puis changer son extension en .command, comme ci-dessous.
Norman Gray

Réponses:

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

Cela ouvre un nouveau terminal et exécute la commande "echo hello" à l'intérieur.

Lac
la source
Je suis sûr que cela est évident pour un expert AppleScript, mais que diriez-vous d'un exemple qui lance un programme? Fondamentalement, comme je peux faire 'xterm -e somecomnand'
gman
3
Cela peut être légèrement plus court:osascript -e 'tell app "Terminal" to do script "echo hello"'
joemaller
1
comment définir le nouveau haut de la fenêtre du terminal actif?
Jenkamen
Et comment puis-je transmettre des arguments sur le modèle de "$@"shell mais dans le script osa?
rednoah
3

Vous pouvez le faire de manière détournée:

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

Les scripts shell qui ont l'extension .commandet qui sont exécutables, peuvent être double-cliqués sur pour s'exécuter dans une nouvelle fenêtre de terminal. La commande open, comme vous le savez probablement, équivaut à double-cliquer sur un objet Finder, donc cette procédure finit par exécuter les commandes dans le script dans une nouvelle fenêtre de terminal.

Légèrement tordu, mais cela semble fonctionner. Je suis sûr qu'il doit y avoir un chemin plus direct vers cela (qu'est-ce que vous essayez réellement de faire?), Mais cela m'échappe en ce moment.

Norman Gray
la source
J'ai essayé cela et un nouveau terminal s'ouvre, mais j'obtiens ensuite: ~ $ /Users/username/Work/Dev/scripts/hello.command; sortie; déconnexion [Processus terminé] Voici mon bonjour.commande: scripts $ cat hello.command #! / bin / sh - dites bonjour
zlog
Ack, cela n'a pas été correctement formaté, mais je pense que vous avez compris.
zlog
@zlog: mais il a dit "bonjour", oui? Dans les préférences de Terminal.app, consultez les «Paramètres» et l'onglet «Shell» à l'intérieur. Vous verrez un menu 'Quand le shell se termine:'. Je pense que la valeur par défaut est «Ne fermez pas la fenêtre», et c'est ce que vous voyez. Si vous changez cela en «Fermer si le shell s'est terminé correctement», la fenêtre du terminal devrait disparaître une fois le script du shell terminé.
Norman Gray
Puis-je demander de laisser sa session ouverte et de ne pas me déconnecter?
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

Vous avez besoin de ruby ​​1.9 ou vous devrez ajouter une ligne require 'rubygems'avant que d'autres ne l'exigent et n'oubliez pas d'installer gem rb-appscript.

J'ai nommé ce script dt(onglet dup), donc je peux simplement exécuter dtpour ouvrir l'onglet dans le même dossier ou dt lsy exécuter également la lscommande.

tig
la source
2

Cela fonctionne, au moins sous Mountain Lion. Il initialise un shell interactif à chaque fois, bien que vous puissiez le remplacer après coup en l'appelant "macterm exec your-command ". Stockez-le dans bin / macterm dans votre répertoire personnel et 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
la source
0

Je le ferais avec AppleScript. Vous pouvez le rationaliser en utilisant la commande osascript. Votre script serait quelque chose comme:

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

Si vous ne souhaitez y accéder que dans le terminal, vous pouvez omettre tout sauf l'instruction tell middle. Si vous voulez une nouvelle fenêtre au lieu d'un nouvel onglet, remplacez la touche t par n.

Je ne suis pas un AppleScripter suffisamment expérimenté pour savoir comment obtenir des arguments de ligne de commande, puis les retaper dans la nouvelle fenêtre, mais je suis sûr que c'est possible et pas trop difficile.

De plus, je pense que cela fonctionne et je ne suis pas en mesure de tester pour le moment, mais je suis presque sûr que vous pouvez démarrer un script shell avec une variante sur #! / Usr / bin / osascript -e, puis l'enregistrer en tant qu'exécutable comme tu veux. Ce qui, au moins dans ma tête, vous permettrait de taper quelque chose comme $ runinnewterm ls / Applications

NReilingh
la source