从命令行打开新终端并在Mac OS X上运行命令?


24

有没有办法从命令行打开新终端,然后在新终端上(在Mac上)运行命令?

例如,类似:

Terminal -e ls

ls新终端中运行的位置。


我试图弄清楚如何使用1命令在新终端中的Rails服务器上运行ruby。
zlog

听起来很合理-我认为您希望stdout出现在打开的终端中。在那种情况下,是的,您想要编写一个shell脚本来完成所需的工作,然后将其扩展名更改为.command,如下所示。
诺曼·格雷

Answers:


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

这将打开一个新终端,并在其中执行命令“ echo hello”。


我敢肯定,这对于applescript专家是显而易见的,但是启动任何程序的示例又如何呢?基本上就像我可以做'xterm -e somecomnand'–
gman

3
这可以略短一些:osascript -e 'tell app "Terminal" to do script "echo hello"'
joemaller

1
如何设置新的终端窗口顶部活动?
詹卡门(Jenkamen)

以及如何"$@"在shell中但在osa脚本中传递参数?
rednoah

3

您可以通过回旋方式来做到这一点:

% cat /tmp/hello.command
#! /bin/sh -
say hello
% chmod +x /tmp/hello.command
% open /tmp/hello.command

.command可以双击具有扩展名且可执行的Shell脚本,以在新的Terminal窗口中运行。open您可能已经知道,该命令等效于双击Finder对象,因此此过程最终在新的Terminal窗口中的脚本中运行命令。

略微扭曲,但确实起作用。我确信必须有一条更直接的路线(您实际上想做什么?),但它现在使我不知所措。


我尝试了此操作,并打开了一个新的终端,但随后得到:〜$ /Users/username/Work/Dev/scripts/hello.command; 出口; 注销[处理完成]这是我的hello.command:scripts $ cat hello.command#!/ bin / sh-打个招呼
zlog 2010年

阿克(Ack),格式不正确,但我想您明白了。
zlog

@zlog:但是它确实说了“你好”,是吗?在Terminal.app的首选项中,查看其中的“设置”和“外壳”选项卡。您会看到一个菜单“当外壳退出时:”。我认为默认值为“不关闭窗口”,这就是您所看到的。如果将其更改为“如果外壳干净退出,则关闭”,则一旦外壳脚本完成,终端窗口应消失。
诺曼·格雷

我可以发出命令以使其会话保持打开状态而不注销吗?
罗伊

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

您需要ruby 1.9,或者您需要require 'rubygems'在其他用户之前添加行,并且不要忘记安装gem rb-appscript

我将此脚本命名为“ dtdup”选项卡,因此我可以运行dt以在同一文件夹中打开选项卡,dt ls也可以在其中运行ls命令。


2

这至少在Mountain Lion下有效。每次都确实会初始化一个交互式shell,尽管您可以通过将其作为“ macterm exec your-command ” 来调用来代替它。将此存储在主目录中的bin / macterm中,并使用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 

0

我会用AppleScript做到这一点。您可以使用osascript命令简化它。您的脚本将类似于:

tell application "Terminal"
  activate
  tell application "System Events"
    keystroke "t" using {command down}
  end tell
end tell

如果只打算在终端中访问它,则可以忽略除中间的tell语句外的所有内容。如果要一个新窗口而不是一个新选项卡,请用n替换t按键。

我还没有足够的经验丰富的AppleScripter知道如何获取命令行参数,然后在新窗口中重新输入它们,但是我敢肯定这是可能的,而且不太困难。

另外,我认为这可行,并且目前无法测试,但是我敢肯定,您可以在#!/ usr / bin / osascript -e上启动带有某些变体的shell脚本,然后将其另存为可执行文件随你怎么便。至少在我看来,这使您可以键入$ runinnewterm ls / Applications之类的东西

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.