Existe uma maneira de abrir um novo terminal na linha de comando e executar um comando nesse novo terminal (em um Mac)?
por exemplo, algo como:
Terminal -e ls
onde ls
é executado no novo terminal.
Existe uma maneira de abrir um novo terminal na linha de comando e executar um comando nesse novo terminal (em um Mac)?
por exemplo, algo como:
Terminal -e ls
onde ls
é executado no novo terminal.
Respostas:
osascript -e 'tell app "Terminal"
do script "echo hello"
end tell'
Isso abre um novo terminal e executa o comando "echo hello" dentro dele.
osascript -e 'tell app "Terminal" to do script "echo hello"'
"$@"
shell, mas no script osa?
Você pode fazer isso de uma maneira indireta:
% cat /tmp/hello.command
#! /bin/sh -
say hello
% chmod +x /tmp/hello.command
% open /tmp/hello.command
Os scripts do shell que possuem a extensão .command
e são executáveis podem ser clicados duas vezes para executar dentro de uma nova janela do Terminal. O comando open
, como você provavelmente sabe, é equivalente a clicar duas vezes em um objeto Finder, portanto, este procedimento acaba executando os comandos no script dentro de uma nova janela do Terminal.
Ligeiramente torcido, mas parece funcionar. Tenho certeza de que deve haver uma rota mais direta para isso (o que você realmente está tentando fazer?), Mas isso me escapa agora.
#!/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
Você precisa do ruby 1.9 ou precisará adicionar uma linha require 'rubygems'
antes que outros o exijam e não se esqueça de instalar gem rb-appscript
.
Eu nomeei esse script dt
(guia dup), para que eu possa executar apenas dt
para abrir a guia na mesma pasta ou dt ls
também para executar o ls
comando there .
Isso funciona, pelo menos no Mountain Lion. Ele inicializa um shell interativo toda vez, embora você possa substituí-lo após o fato, invocando-o como "macterm exec your-command ". Armazene isso em bin / macterm em seu diretório pessoal e 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
Eu faria isso com AppleScript. Você pode simplificá-lo usando o comando osascript. Seu script seria algo como:
tell application "Terminal"
activate
tell application "System Events"
keystroke "t" using {command down}
end tell
end tell
Se você só vai acessá-lo no terminal, pode omitir tudo, exceto a declaração do meio. Se você deseja uma nova janela em vez de uma nova guia, substitua a tecla t por n.
Não sou um AppleScripter experiente o suficiente para saber como obter argumentos de linha de comando e redigitá-los na nova janela, mas tenho certeza de que é possível e não muito difícil.
Além disso, acho que isso funciona e não posso testar agora, mas tenho certeza de que você pode iniciar um shell script com alguma variante em #! / Usr / bin / osascript -e e salvá-lo como executável como você quiser. O que, pelo menos na minha cabeça, permitiria digitar algo como $ runinnewterm ls / Applications