我可以从命令行(或程序,通过系统调用)启动xterm,如下所示:
/usr/X11/bin/xterm -fg SkyBlue -bg black -e myscript
这将启动带有蓝色文本和黑色背景的xterm,并在其中运行任意脚本。
我的问题:如何使用Terminal.app执行等效操作?
答案 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 answer和this 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。 p>
注意:当我使用它时,我有时会有两个终端窗口,一个运行在〜中的shell,另一个运行来自argv [1]的cd命令和命令。如果终端尚未运行,似乎会发生;也许它正在打开旧状态(即使我关闭它时我没有打开的终端)。