osascript -e 'tell app "Terminal"
do script "echo hello"
end tell'
Isso abre um novo terminal e executa o comando "echo hello" dentro dele.
Existe uma maneira de abrir um novo terminal a partir da 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.
Você pode fazer isso de uma forma 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 que são executáveis, podem ser clicados duas vezes para serem executados dentro de uma nova janela do Terminal. O comando open
, como você provavelmente sabe, equivale a clicar duas vezes em um objeto Finder, então este procedimento acaba executando os comandos no script dentro de uma nova janela do Terminal.
Ligeiramente torcida, mas parece funcionar. Eu tenho certeza que deve ser uma rota mais direta para isso (o que é que você está realmente 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 a linha require 'rubygems'
antes dos outros requerer e não se esqueça de instalar gem rb-appscript
.
Eu nomeei esse script dt
(guia dup), portanto, posso executar apenas dt
para abrir a guia na mesma pasta ou dt ls
para também executar o comando ls
.
Eu faria isso com o 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, então você pode omitir todos, exceto o meio tell statement. Se você quiser uma nova janela em vez de uma nova aba, substitua o pressionamento de tecla 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 que você pode iniciar um script de shell com alguma variante em #! / usr / bin / osoftware -e, em seguida, salve-o como um executável como você quiser. Que, pelo menos na minha cabeça, tornaria possível digitar algo como $ runinnewterm ls / Applications
Isso funciona, pelo menos sob o Leão da Montanha. Ele inicializa um shell interativo a cada vez, embora você possa substituí-lo após o fato invocando-o como "macterm exec seu-comando ". Armazene isto em bin / macterm no seu diretório home 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
Tags command-line terminal macos