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
où ls
est exécuté dans le nouveau terminal.
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
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.
#!/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.
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