在浏览我的主目录中的隐藏文件时,我发现了.bash_logout
。我通过文件中的以下内容找到了
if [ "$SHLVL" = 1 ]; then
[ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi
我不太擅长使用 BASH,所以我请求有人能为我解释一下。SHLVL 是怎么回事?
谢谢。
答案1
该脚本 - .bash_logout
- 在以下情况下由 bash 执行登录外壳退出,并且问题中的代码旨在清除屏幕以在离开控制台时增加隐私。
SHLVL
是一个来自“SHell LeVeL”的环境变量,它允许您跟踪当前 shell 的子 shell 深度。在顶级 shell 中, 的值为$SHLVL
1。在第一个子 shell 中, 的值为 2;在子子 shell 中, 的值为 3;依此类推。因此,SHLVL 表示用户有多少个 shell 深度。如果级别为 2,则必须键入exit
,然后logout
退出。
因此,如果"$SHLVL" = 1
即如果你处于顶层 shell 中,那么......
[ -x /usr/bin/clear_console ]
是另一个测试,含义类似于:测试文件是否/usr/bin/clear_console
存在且是否可执行。
因为&&
这个命令:/usr/bin/clear_console -q
只有[ -x /usr/bin/clear_console ]
成功完成才会执行。
最后:这是什么/usr/bin/clear_console
意思?来自man clear_console
:
清除控制台如果可能的话,清除你的控制台。它看起来在 终端类型的环境,然后在 terminfo 数据库中 弄清楚如何清除屏幕。要清除缓冲区,它 将前台虚拟终端更改为另一个终端,然后 返回原始终端。
clear_console
非常接近clear
可以在任何终端/控制台使用的命令。
答案2
如果您只是想知道为什么,请向下滚动。
从man bash
SHLVL Incremented by one each time an instance of bash is started.
但是,这还不是100%清楚...让我们看看:
# echo $SHLVL
1
# ps faux
...
user 4440 0.0 0.9 599220 18796 ? Sl 08:35 0:00 gnome-terminal
user 4447 0.0 0.2 31912 5304 pts/2 Ss+ 08:35 0:00 \_ bash
...
#
# screen
# echo $SHLVL
2
# ps faux
...
user 4440 0.0 0.9 599220 18796 ? Sl 08:35 0:00 gnome-terminal
user 4447 0.0 0.2 31920 5324 pts/2 Ss 08:35 0:00 \_ bash
user 4772 0.0 0.0 34656 1224 pts/2 S+ 08:43 0:00 \_ screen
user 4773 0.0 0.0 34816 1396 ? Ss 08:43 0:00 \_ SCREEN
user 4774 0.3 0.2 31952 5188 pts/3 Ss+ 08:43 0:00 \_ /bin/bash
...
#
# bash
# echo $SHLVL
3
# ps faux
user 4440 0.0 0.9 599220 18796 ? Sl 08:35 0:00 gnome-terminal
user 4447 0.0 0.2 31920 5324 pts/2 Ss 08:35 0:00 \_ bash
user 4772 0.0 0.0 34656 1224 pts/2 S+ 08:43 0:00 \_ screen
user 4773 0.0 0.0 34816 1396 ? Ss 08:43 0:00 \_ SCREEN
user 4774 0.1 0.2 31952 5348 pts/3 Ss 08:43 0:00 \_ /bin/bash
user 4832 1.3 0.2 31952 5184 pts/3 S+ 08:45 0:00 \_ bash
因此,每次当一个 bash 嵌套在另一个 bash 中时,变量都会递增。并且您的代码部分会导致最后一个 bash 退出时屏幕被清除。但它并未在图形终端会话中执行,只是在虚拟终端中执行(例如当您点击ctrl+ alt+时f1)并在那里工作。
原因是下一个在该虚拟终端上工作的人无法看到你上一个屏幕的输出。因为屏幕上可能有关键信息。
答案3
通过快速谷歌搜索,似乎 SHLVL 相当于“SHell LeVeL”,反映出你对嵌套 shell 的了解程度。即一个 shell 打开另一个 shell,然后又打开另一个 shell,等等。
每个打开的子 shell 都会增加这个值,因此代码会检查这是否是嵌套的顶层 - 即第 1 级。
如果是,那么它将(如果 /usr/bin/clear_console 存在且可执行)运行代码来清除屏幕。