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
où ls
est exécuté dans le nouveau terminal.
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
où ls
est exécuté dans le nouveau terminal.
Réponses:
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.
osascript -e 'tell app "Terminal" to do script "echo hello"'
"$@"
shell mais dans le script osa?
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 .command
et 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.
#!/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 dt
pour ouvrir l'onglet dans le même dossier ou dt ls
y exécuter également la ls
commande.
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
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