![Mac OS X 终端启动时没有窗口](https://linux22.com/image/1348803/Mac%20OS%20X%20%E7%BB%88%E7%AB%AF%E5%90%AF%E5%8A%A8%E6%97%B6%E6%B2%A1%E6%9C%89%E7%AA%97%E5%8F%A3.png)
我很好奇是否有人找到了一种好方法,可以让 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
进程并使用提取进程IDcut
。
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 秒启动时,但我不想增加进一步的复杂性。