我希望每个打开的终端都会通过屏幕会话启动。其实我想要的只是通过以下步骤完成:
1. win+enter (open terminal in i3wm)
2. $ screen
我想自动做到这一点并把
[[ $TERM != "screen" ]] && screen
里面.bashrc
。作为副作用,现在我看到生成了很多 bash 进程(为什么?)
alexhop+ 19307 0.0 0.0 28276 3016 pts/0 S+ 11:20 0:00 screen
alexhop+ 19308 2.5 0.4 59272 33572 ? Rs 11:20 0:00 SCREEN
alexhop+ 19309 0.2 0.0 24084 5516 pts/2 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19322 0.2 0.0 24084 5456 pts/3 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19338 0.2 0.0 24084 5316 pts/4 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19354 0.2 0.0 24084 5452 pts/5 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19370 0.2 0.0 24084 5388 pts/6 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19386 0.2 0.0 24084 5356 pts/7 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19402 0.2 0.0 24084 5452 pts/8 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19418 0.2 0.0 24084 5436 pts/9 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19434 0.2 0.0 24084 5456 pts/10 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19450 0.2 0.0 24084 5396 pts/11 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19466 0.2 0.0 24084 5388 pts/12 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19482 0.2 0.0 24084 5388 pts/13 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19498 0.2 0.0 24084 5388 pts/14 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19514 0.2 0.0 24084 5384 pts/15 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19530 0.2 0.0 24084 5512 pts/16 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19546 0.2 0.0 24084 5388 pts/17 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19562 0.0 0.0 24084 5384 pts/18 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19578 0.2 0.0 24084 5436 pts/19 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19594 0.2 0.0 24084 5388 pts/20 Ss+ 11:20 0:00 /bin/bash
alexhop+ 19610 0.3 0.0 24084 5384 pts/21 Ss+ 11:20 0:00 /bin/bash
任何帮助,将不胜感激。
主机系统:Ubuntu 16.04.2 LTS
答案1
这几乎肯定会发生,因为您的环境中的某些东西(.bashrc
,/etc/profile
,等等)正在设置 TERM 变量(例如类似的东西TERM=xterm
)。
这会导致[[ $TERM != "screen" ]]
测试评估为 true,因此启动另一个 screen 实例。
bash
screen 然后在其内部运行 $SHELL,导致启动screen
和screen
启动的无限循环bash
。
顺便说一句,如果在启动$TERM
之前没有正确设置,那么将不知道如何正确地使用它正在运行的终端。所以不设置它不是一个好的选择。screen
screen
有几种更好的方法可以检测 shell 是否正在内部运行screen
。看我如何知道我是否正在 Linux“屏幕”内运行?和如何判断我是否在屏幕中?从其他许多次在姐妹 Stack Exchange 网站上提出这个问题的答案。
最简单的方法可能是测试 $STY 变量是否为空。根据man screen
,该变量设置为screen
保存“备用套接字名称”。
换句话说,不是:
[[ $TERM != "screen" ]] && screen
尝试这个:
[ -z "$STY" ] && screen # test if $STY is empty
或者:
[ -n "$STY" ] || screen # test if $STY is NOT empty.
[[ .... ]]
如果您愿意,也可以使用。它没有什么区别,只是你不必双引号$STY
。在我看来,这是一个坏习惯,无论如何你都应该引用它,因为你的情况做必须双引号变量的数量远远多于少数不需要的特殊情况。