что делает следующий файл скрипта bash?

при просмотре скрытых файлов моего домашнего каталога я обнаружил .bash_logout. Я нашел это содержимое в файле

if [ "$SHLVL" = 1 ]; then
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

Я не очень хорошо разбираюсь в BASH & amp; Я прошу это, кто-нибудь может объяснить это для меня. что за сделка с SHLVL?

Спасибо.

3
задан 17.04.2020, 18:08

3 ответа

Этот скрипт - .bash_logout - выполняется bash при выходе из оболочки входа , и этот код из вашего вопроса намеревается очистить экран, чтобы повысить конфиденциальность при выходе из консоли.

SHLVL - это переменная окружения, которая пришла из "SHell LeVeL" и позволяет вам отслеживать, сколько подоболочек находится глубоко в вашей текущей оболочке. В вашей оболочке верхнего уровня значение $SHLV равно 1. В первом подоболочке это 2; в под-оболочке - 3; и так далее. Таким образом, SHLVL указывает, сколько оболочек находится у пользователя. Если уровень равен 2, вы должны набрать exit, а затем logout для выхода.

Итак, если "$SHLVL" = 1, т.е. если вы находитесь в оболочке верхнего уровня, то ...

[ -x /usr/bin/clear_console ] является еще одним тестом и означает что-то вроде: проверить, существует ли файл /usr/bin/clear_console и является ли он исполняемым.

Из-за && эта команда: /usr/bin/clear_console -q выполняется только в случае успешного выполнения [ -x /usr/bin/clear_console ].

1123 И, наконец, что означает /usr/bin/clear_console? Из man clear_console :

clear_console clears your console if this is possible.  It looks in the
environment for the terminal type and then in the terminfo database  to
figure  out  how  to  clear  the  screen.  To clear the buffer, it then
changes the foreground virtual terminal to another  terminal  and  then
back to the original terminal.

clear_console очень подходит команда clear, которую можно использовать в любом терминале / консоли. [1124 ]

7
ответ дан 17.04.2020, 18:09

Если вы просто хотите знать, почему прокрутите вниз.

Из 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 выходит из экрана, он будет очищен. Но он не был выполнен в сеансах графического терминала, только в виртуальных терминалах (например, когда вы нажимаете ctrl + alt + f1 ) и работаете там.

Причина в том, что следующий человек, который работает на этом виртуальном терминале, не может видеть вывод последнего экрана, который у вас был. Потому что, возможно, на экране есть важная информация.

1
ответ дан 17.04.2020, 18:09

Из быстрого гугла кажется, что SHLVL приравнивается к «SHell LeVeL» и отражает, насколько глубоко вы находитесь с вложенными оболочками. То есть одна оболочка, открывает другую, которая открывает другую и т. д.

Это значение увеличивается для каждой открытой вложенной оболочки, поэтому код проверяет, является ли это верхним уровнем гнезда, т.е. уровнем 1.

Если это так, то он (если / usr / bin / clear_console существует и является исполняемым) запускает код для очистки экрана.

Взято отсюда: http://linux.about.com/cs/linux101/g/shlvl.htm

1
ответ дан 17.04.2020, 18:10

Теги

Похожие вопросы