Abrindo um novo terminal na linha de comando e executando um comando no Mac OS X?

24

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.

zlog
fonte
Estou tentando descobrir como executar um servidor ruby ​​on rails em um novo terminal, usando 1 comando.
Zlog 17/08/10
Isso parece razoável - suponho que você queira que o stdout apareça no terminal aberto. Nesse caso, sim, você deseja escrever um script de shell que faça o trabalho que você deseja e depois alterar sua extensão para .command, como abaixo.
Norman Gray

Respostas:

24
osascript -e 'tell app "Terminal"
    do script "echo hello"
end tell'

Isso abre um novo terminal e executa o comando "echo hello" dentro dele.

Laca
fonte
Tenho certeza de que isso é óbvio para um especialista do AppleScript, mas que tal um exemplo que lança qualquer programa? Basicamente, como eu posso fazer 'xterm -e somecomnand'
gman
3
Isso pode ser um pouco mais curto:osascript -e 'tell app "Terminal" to do script "echo hello"'
joemaller
1
como definir a nova janela do terminal superior ativa?
Jenkamen
E como passo adiante argumentos ao longo das linhas de "$@"shell, mas no script osa?
rednoah 12/02
3

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 .commande 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.

Norman Gray
fonte
Eu tentei isso e um novo terminal é aberto, mas então recebo: ~ $ /Users/username/Work/Dev/scripts/hello.command; Saída; logout [Processo concluído] Este é o meu hello.command: scripts $ cat hello.command #! / bin / sh - diga olá
zlog
Bem, isso não foi formatado corretamente, mas acho que você entendeu.
Zlog 17/08/10
@ zlog: mas dizia 'olá', sim? Nas preferências do Terminal.app, consulte a guia 'Configurações' e 'Shell'. Você verá um menu 'Quando o shell sair:'. Eu acho que o padrão é 'Não feche a janela', e é isso que você está vendo. Se você mudar para 'Fechar se o shell sair corretamente', a janela do terminal deverá desaparecer assim que o script do shell terminar.
Norman Gray
Posso fazer o comando para deixar sua sessão aberta e não sair?
Royi 01/09/19
2
#!/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 dtpara abrir a guia na mesma pasta ou dt lstambém para executar o lscomando there .

tig
fonte
2

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 
Bluby
fonte
0

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

NReilingh
fonte