Abrindo um novo terminal a partir da linha de comando e executando um comando no Mac OS X?

20

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.

    
por zlog 11.08.2010 / 10:38

5 respostas

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

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

    
por 09.07.2011 / 15:00
2

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.

    
por 11.08.2010 / 10:56
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 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 .

    
por 12.08.2010 / 10:36
0

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

    
por 11.08.2010 / 18:08
0

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 
    
por 22.01.2013 / 01:08