Mac OS X 终端启动时没有窗口

Mac OS X 终端启动时没有窗口

我很好奇是否有人找到了一种好方法,可以让 Mac 上的终端应用在不打开窗口的情况下打开。启动首选项中有“使用设置打开新窗口:”或打开特定窗口组的选项,但我希望它一开始什么都不打开。我尝试保存一个没有窗口的窗口组,但它又恢复为只打开一个默认窗口。

答案1

我找不到任何选项来阻止在终端启动时打开窗口,但你可以检查当前bash会话是否在确切地终端启动时。如果是这种情况,会话bash应该退出。

不过,您会看到一个窗口在一瞬间出现又消失。

添加以下代码(在 Mac OS X 10.5.8 (Leopard) 上测试)[请参阅下面的注释] 和 OS X 10.8.2 (Mountain Lion)) 添加到您的开头~/.bash_profile

shell_started=$(ps -A -o lstart $$ | grep -v STARTED)
terminal_started=$(ps -A -o lstart $(ps -A -o pid -o command | grep '/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal -psn' | grep -v grep | cut -d '/' -f 1) | grep -v STARTED)
if [ "X$shell_started" == "X$terminal_started" ]; then exit; fi

代码解释:

shell_started=$(ps -A -o lstart $$ | grep -v STARTED):ps 当变量标识的进程启动时执行打印$$$$ bash扩展至本次会话的 PID)。然后过滤出标题(其中包含单词STARTED)。将结果值赋给变量shell_started

ps -A -o pid -o command | grep '/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal -psn' | grep -v grep | cut -d '/' -f 1:执行ps打印所有进程命令名称,选择与终端完整路径匹配的命令名称,过滤掉任何虚假grep进程并使用提取进程ID cut

terminal_started=$(ps -A -o lstart $(...) | grep -v STARTED)ps在进程终端启动时执行打印,并过滤掉标题(其中包含单词STARTED)。

(我必须分terminal_started两个步骤来摆脱 ps添加到输出中的 TAB。)

if [ "X$shell_started" == "X$terminal_started" ]; then exit; fi:比较两个日期,如果相等,则退出shell,即关闭终端窗口。

如果它对你不起作用(就像 OP 的情况一样,他使用 Mac OS X 10.6.8 (Snow Leopard)),请尝试:

shell_started=$(ps -A -o lstart $$ | grep -v STARTED)
terminal_started=$(ps -A -o lstart $(ps -A -o pid -o command | grep '/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal -psn' | grep -v grep | tail -n 1| cut -d '/' -f 1) | grep -v STARTED)
if [ "X$shell_started" == "X$terminal_started" ]; then exit; fi

(这里唯一的区别是,如果有多个条目,则tail选择terminal_started打印的最后一个条目。)ps


Mac OS X 10.5.8 (Leopard) 注意事项:在我的旧 PowerBook G4 上,我注意到终端的启动时间和当前会话的启动时间有时相差一秒bash。如果您在使用较慢的计算机时遇到类似问题,请将以下三行添加到上述代码的末尾:

one_second_before=$(expr "$shell_started" : '.*:\([0-9][0-9]\) .*' - 1)
shell_started_one_second_before=$(echo $shell_started | sed 's/\(.*:\)\([0-9][0-9]\)\( .*\)/\1'$one_second_before'\3/')
if [ "X$shell_started_one_second_before" == "X$terminal_started" ]; then exit; fi

这段代码不能很好地处理一个边界条件,即当 shell 在第 0 秒启动时,但我不想增加进一步的复杂性。

相关内容