web-dev-qa-db-fra.com

Ouverture d'un nouveau terminal de la ligne de commande et exécutez une commande sur Mac OS X?

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

e.G., quelque chose comme:

Terminal -e ls

ls est exécuté dans le nouveau terminal.

25
zlog

Cela fonctionne, du moins sous Lion de montagne. Il initialise une coque interactive à chaque fois, bien que vous puissiez remplacer cela après le fait en l'appelant comme "Macterm Exec votre commande". Conservez ceci dans la corbeille/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 
3
Bluby

Vous pouvez le faire de manière rond-point:

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

Scripts shell qui ont l'extension .command Et quels sont exécutables, on peut double-cliquer sur pour fonctionner à l'intérieur d'une nouvelle fenêtre de terminal. La commande open, comme vous le savez probablement, est équivalente à double-cliquer sur un objet Finder. Cette procédure finit donc à exécuter les commandes du script dans une nouvelle fenêtre de terminal.

Légèrement tordu, mais il semble fonctionner. Je suis sûr que là-bas DOI Soyez un itinéraire plus direct vers ceci (qu'est-ce que vous essayez réellement de faire?), Mais cela m'échappe en ce moment.

3
Norman Gray
#!/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 Ruby 1.9 ou vous devrez ajouter une ligne require 'rubygems' avant que d'autres nécessitent et n'oubliez pas d'installer gem rb-appscript.

J'ai nommé ce script dt (onglet DUP), afin que je puisse simplement exécuter dt _ pour ouvrir l'onglet dans le même dossier ou dt ls Pour y arriver ls commande.

2
tig

Je ferais cela avec AppleScript. Vous pouvez la rationaliser à l'aide de la commande OSASScript. 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 n'allez jamais accéder à cela dans le terminal, vous pouvez alors omettre tout sauf la déclaration de rachat au milieu. Si vous souhaitez une nouvelle fenêtre au lieu d'un nouvel onglet, remplacez la touche T avec n.

Je ne suis pas assez expérimenté Completscripter 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.

Aussi, I pense Cela fonctionne et je ne suis pas capable de tester maintenant, mais je suis sûr que vous pouvez démarrer un script shell avec une variante sur #!/USR/bin/Osascript -e Et ensuite, enregistrez-le comme exécutable mais vous voulez. Qui, au moins dans ma tête, vous permettrait de taper quelque chose comme $ runinnewterm ls/applications

0
NReilingh