使用指定的命令(和自定义颜色)以编程方式启动Terminal.app

时间:2010-12-09 23:34:36

标签: macos command-line terminal applescript

我可以从命令行(或程序,通过系统调用)启动xterm,如下所示:

/usr/X11/bin/xterm -fg SkyBlue -bg black -e myscript

这将启动带有蓝色文本和黑色背景的xterm,并在其中运行任意脚本。

我的问题:如何使用Terminal.app执行等效操作?

6 个答案:

答案 0 :(得分:21)

您也可以通过捆绑包ID打开应用,并提供其他参数。

如果当前目录中有可执行脚本test.sh,则会打开以下命令并在Terminal.app中运行它

 open -b com.apple.terminal test.sh 

我能找到的唯一缺点是终端似乎没有继承你当前的环境,所以你必须安排另一种方法将参数传递给你想要运行的脚本。我想在运行中构建脚本以嵌入参数将是一种方法(考虑到当然的安全隐患......)

答案 1 :(得分:13)

几乎所有(每个?)osx程序都可以使用以下命令从命令行启动:

appName.app/Contents/MacOS/command

对于终端,命令是:

/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal

您可以使用自动填充(tab)或ls来查找正确的文件名。 “.app”基本上是一个文件夹。

更改颜色并运行脚本...我认为你无法使用shell脚本,因为终端不接受参数(“终端myScript.sh”不启动myScript)。有了iTerm就行了。

解决方法是使用applescript(包装在shell脚本中):

   #!/bin/sh
   osascript -e '
     tell application "Terminal"
       activate
       tell window 1
          do script "sleep 5; exit"
          set background color to {0, 11111, 11111}
          set win_id to id
       end tell

       set w_ids to (id of every window)

       repeat while w_ids contains win_id
         delay 1
         set w_ids to (id of every window)
       end repeat
    end tell'

好的,现在它应该与xterm示例完全相同。缺点是不断轮询窗口ID(编程不好)。

编辑:更优雅的AppleScript会使用Terminal的'busy'属性。我会保留原始代码,因为它适用于一般程序(不仅仅是终端)。

tell application "Terminal"
    tell window 1
        do script "sleep 2"
        set background color to {0, 11111, 11111}
        repeat while busy
            delay 1
        end repeat
        close
    end tell
end tell

同样,对于完美正确的程序,应该检查终端是否正在运行。它会影响打开的窗口数量。所以,这应该先运行(同样是一个令人讨厌的黑客,我稍后会编辑,因为我找到工作解决方案)。

tell application "System Events"
    if (count (processes whose name is "Terminal")) is 0 then
        tell application "Terminal"
            tell window 1
                close
            end tell
        end tell
    end if
end tell

BR,
尤哈

答案 2 :(得分:11)

假设您已经在其中一个终端配置文件中拥有了所需的颜色,这就是我提出的内容(在Juha's answerthis Serverfault answer的帮助下)。


<强>更新

经过反思,我认为这个echo业务太复杂了。事实证明,您可以使用osascript制作一个带有shebang行的可执行AppleScript文件:

#!/usr/bin/osascript                                                                            

on run argv                                                                                     
  if length of argv is equal to 0                                                               
    set command to ""                                                                           
  else                                                                                          
    set command to item 1 of argv                                                               
  end if                                                                                        

  if length of argv is greater than 1                                                           
    set profile to item 2 of argv                                                               
    runWithProfile(command, profile)                                                            
  else                                                                                          
    runSimple(command)                                                                          
  end if                                                                                        
end run                                                                                         

on runSimple(command)                                                                           
  tell application "Terminal"                                                                   
    activate                                                                                    
    set newTab to do script(command)                                                            
  end tell                                                                                      
  return newTab                                                                                 
end runSimple                                                                                   

on runWithProfile(command, profile)                                                             
  set newTab to runSimple(command)                                                              
  tell application "Terminal" to set current settings of newTab to (first settings set whose name is profile)                                                                                      
end runWithProfile

将其保存为term.scpt,使其chmod +x可执行,并以与下面相同的方式使用它,例如term.scpt "emacs -nw" "Red Sands"


原始回答:

假设我们将下面的脚本保存为term.sh ...

#!/bin/sh

echo '
on run argv
  if length of argv is equal to 0
    set command to ""
  else
    set command to item 1 of argv
  end if

  if length of argv is greater than 1
    set profile to item 2 of argv
    runWithProfile(command, profile)
  else
    runSimple(command)
  end if
end run

on runSimple(command)
  tell application "Terminal"
    activate
    set newTab to do script(command)
  end tell
  return newTab
end runSimple

on runWithProfile(command, profile)
  set newTab to runSimple(command)
  tell application "Terminal" to set current settings of newTab to (first settings set whose name is profile)
end runWithProfile
' | osascript - "$@" > /dev/null

...可以按如下方式调用:

  • term.sh
    • 打开一个新的终端窗口,没什么特别的
  • term.sh COMMAND
    • 打开一个新的终端窗口,执行指定的命令。带参数的命令可以用引号括起来,例如: term.sh "emacs -nw"打开新终端并运行(非窗口化)emacs
  • term.sh COMMAND PROFILE
    • 打开一个新的终端窗口,执行指定的命令,并将其设置为指定的配置文件。其名称中带有空格的配置文件可以用引号括起来,例如: term.sh "emacs -nw" "Red Sands"打开一个新终端并使用Red Sands个人资料运行(非窗口化)emacs。

如果使用错误的命令名称调用它,它仍将打开窗口并设置配置文件,但您将在新窗口中收到bash的错误消息。

如果您使用错误的配置文件名称调用它,该窗口仍将打开,命令仍将执行,但窗口将坚持使用默认配置文件,您将收到一条错误消息(对于stderr,无论您在何处启动它)

的行
  

525:601:执行错误:终端出错:无法获取名称=“elvis”的设置1。索引无效。 (-1719)

如果我花时间学习getopt(例如像term.sh -p profile -e command之类的东西会更好,并且例如可以让你轻松打开,那么这个调用可能会有点改进指定配置文件中的新终端,无需调用命令)。如果有办法搞砸复杂的引用,我也不会感到惊讶。但它适用于大多数目的。

答案 3 :(得分:4)

您还可以进入终端GUI,完全配置心脏内容的选项,并将它们导出到“.terminal”文件,和/或将配置分组到一个窗口组并将其导出到终端文件“myGroup” 。终奌站”。然后

打开myGroup.terminal

将立即打开终端,并配置所有设置和启动命令。

答案 4 :(得分:1)

您可以使用以下命令启动终端,但不确定如何指定颜色:

 open /Applications/Utilities/Terminal.app/

答案 5 :(得分:1)

@ david-moles上面的答案有效,但运行终端并命令〜而不是启动术语的当前工作目录。此变体添加了cd命令。

#!/usr/bin/env bash
# based on answer by @david-moles in 
# https://stackoverflow.com/questions/4404242/programmatically-launch-terminal-app-with-a-specified-command-and-custom-colors
echo "
on run argv
  if length of argv is equal to 0
    set command to \"\"
  else
    set command to item 1 of argv
  end if
  set command to \"cd '"$PWD"' ;\" & command
  if length of argv is greater than 1
    set profile to item 2 of argv
    runWithProfile(command, profile)
  else
    runSimple(command)
  end if
end run

on runSimple(command)
  tell application \"Terminal\"
    activate
    set newTab to do script(command)
  end tell
  return newTab
end runSimple

on runWithProfile(command, profile)
  set newTab to runSimple(command)
  tell application \"Terminal\" to set current settings of newTab to (first settings set whose name is profile)
end runWithProfile
" | osascript - "$@" > /dev/null

可能有一种方法可以使用applescript设置PWD。

注意:当我使用它时,我有时会有两个终端窗口,一个运行在〜中的shell,另一个运行来自argv [1]的cd命令和命令。如果终端尚未运行,似乎会发生;也许它正在打开旧状态(即使我关闭它时我没有打开的终端)。