Komut satırından yeni bir terminal açmanın ve bu yeni terminalde (Mac'te) bir komut çalıştırmanın bir yolu var mı?
örneğin, şöyle bir şey:
Terminal -e ls
ls
Yeni terminalde nerede çalıştırılır.
Komut satırından yeni bir terminal açmanın ve bu yeni terminalde (Mac'te) bir komut çalıştırmanın bir yolu var mı?
örneğin, şöyle bir şey:
Terminal -e ls
ls
Yeni terminalde nerede çalıştırılır.
Yanıtlar:
osascript -e 'tell app "Terminal"
do script "echo hello"
end tell'
Bu yeni bir terminal açar ve içindeki "echo hello" komutunu çalıştırır.
osascript -e 'tell app "Terminal" to do script "echo hello"'
"$@"
kabuklu satırlar boyunca ancak osa betiğinde nasıl iletirim?
Bunu dolambaçlı bir şekilde yapabilirsiniz:
% cat /tmp/hello.command
#! /bin/sh -
say hello
% chmod +x /tmp/hello.command
% open /tmp/hello.command
Uzantısına sahip olan .command
ve çalıştırılabilir olan kabuk komut dosyaları, yeni bir Terminal penceresi içinde çalıştırmak için çift tıklanabilir. open
Muhtemelen bildiğiniz gibi, komut bir Finder nesnesine çift tıklamakla eşdeğerdir, bu nedenle bu prosedür komutları komut satırında yeni bir Terminal penceresi içinde çalıştırmakla sona erer.
Hafifçe bükülmüş, fakat işe yaramış gibi görünüyor. Bunun için daha doğrudan bir yol olması gerektiğine inanıyorum (aslında ne yapmaya çalışıyorsun?), Ama şu anda benden kaçıyor.
#!/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
Yakut 1.9'a ihtiyacınız var, require 'rubygems'
yoksa diğerleri gerektirmeden satır eklemeniz gerekecek ve yüklemeyi unutmayın gem rb-appscript
.
Bu betiği dt
(dup tab) adlandırdım, böylece sadece dt
aynı klasördeki sekmeyi açmak veya dt ls
orada ls
komutu çalıştırmak için koşabilirim .
Bu, en azından dağ aslanı altında çalışır. Her seferinde etkileşimli bir kabuk başlatır, ancak "macterm komutunu çalıştır" olarak çağırdıktan sonra gerçeği değiştirebilirsin . Bunu bin / macterm dizininde saklayın ve chmod a + x bin / macterm dizinini kullanın:
#!/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
Bunu AppleScript ile yapardım. Osascript komutunu kullanarak düzene sokabilirsiniz. Komut dosyanız şöyle bir şey olurdu:
tell application "Terminal"
activate
tell application "System Events"
keystroke "t" using {command down}
end tell
end tell
Eğer sadece terminalde erişecekseniz, o zaman orta söyleyen ifadeden başka hepsini ihmal edebilirsiniz. Yeni bir sekme yerine yeni bir pencere istiyorsanız, t tuşunu n ile değiştirin.
Komut satırı argümanlarını nasıl alacağımı ve yeni pencerede nasıl yeniden yazacağımı bilecek kadar deneyimli bir AppleScripter değilim, ancak bunun mümkün ve çok zor olmadığından eminim.
Ayrıca, bunun işe yaradığını düşünüyorum ve şu anda test edemiyorum, ancak #! / Usr / bin / osascript -e üzerinde bir değişkenle bir kabuk betiği başlatabildiğinizden eminim ve sonra çalıştırılabilir olarak kaydedebilirsiniz. sen nasıl istersen Bu, en azından kafamda, $ runinnewterm ls / Applications gibi bir şey yazmanızı mümkün kılacaktır.