Gibt es eine Möglichkeit, ein neues Terminal über die Befehlszeile zu öffnen und einen Befehl auf diesem neuen Terminal auszuführen (auf einem Mac)?
zB Etwas wie:
Terminal -e ls
wo ls
wird im neuen terminal gefahren.
Gibt es eine Möglichkeit, ein neues Terminal über die Befehlszeile zu öffnen und einen Befehl auf diesem neuen Terminal auszuführen (auf einem Mac)?
zB Etwas wie:
Terminal -e ls
wo ls
wird im neuen terminal gefahren.
Antworten:
osascript -e 'tell app "Terminal"
do script "echo hello"
end tell'
Dies öffnet ein neues Terminal und führt darin den Befehl "hallo echo" aus.
osascript -e 'tell app "Terminal" to do script "echo hello"'
"$@"
in Shell, aber in OSA-Schrift geschrieben sind?
Sie können es auf Umwegen tun:
% cat /tmp/hello.command
#! /bin/sh -
say hello
% chmod +x /tmp/hello.command
% open /tmp/hello.command
Shell-Skripte, die die Erweiterung haben .command
und ausführbar sind, können durch Doppelklicken in einem neuen Terminal-Fenster ausgeführt werden. Der Befehl entspricht open
, wie Sie wahrscheinlich wissen, einem Doppelklick auf ein Finder-Objekt, sodass bei dieser Prozedur die Befehle im Skript in einem neuen Terminalfenster ausgeführt werden.
Leicht verdreht, aber es scheint zu funktionieren. Ich bin mir sicher, dass es einen direkteren Weg dazu geben muss (was versuchen Sie eigentlich?), Aber es entgeht mir im 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
Sie benötigen Ruby 1.9, oder Sie müssen eine Zeile hinzufügen, require 'rubygems'
bevor andere dies erfordern, und die Installation nicht vergessen gem rb-appscript
.
Ich habe dieses Skript dt
(dup tab) so benannt, dass ich es einfach ausführen kann dt
, um die Registerkarte in demselben Ordner zu öffnen oder dt ls
um dort den ls
Befehl auszuführen .
Dies funktioniert zumindest unter Mountain Lion. Es wird jedes Mal eine interaktive Shell initialisiert, obwohl Sie diese nachträglich ersetzen können, indem Sie sie als "macterm exec your-command " aufrufen . Speichern Sie dies in bin / macterm in Ihrem Home-Verzeichnis und 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
Ich würde das mit AppleScript machen. Sie können es mit dem Befehl osascript optimieren. Ihr Skript würde ungefähr so aussehen:
tell application "Terminal"
activate
tell application "System Events"
keystroke "t" using {command down}
end tell
end tell
Wenn Sie nur im Terminal darauf zugreifen, können Sie alle Anweisungen außer der mittleren tell-Anweisung weglassen. Wenn Sie ein neues Fenster anstelle einer neuen Registerkarte möchten, ersetzen Sie den t-Tastenanschlag durch n.
Ich bin kein erfahrener AppleScripter, der weiß, wie man Befehlszeilenargumente abruft und sie dann im neuen Fenster erneut eingibt, aber ich bin sicher, dass dies möglich und nicht allzu schwierig ist.
Ich denke auch, dass dies funktioniert und ich kann es momentan nicht testen, aber ich bin mir ziemlich sicher, dass Sie ein Shell-Skript mit einer Variante von #! / Usr / bin / osascript -e starten und es dann als ausführbare Datei speichern können wie auch immer du willst. Zumindest in meinem Kopf würde das es Ihnen ermöglichen, so etwas wie $ runinnewterm ls / Applications einzugeben