Я читал разницу между sudo -i/-s здесь. После использования команды shopt отмечается, что все (sudo su/sudo -i/sudo -s) $SHELL предоставляют одинаковые результаты, но результаты команды shopt отличаются.
Итак, как определяется идентификатор входа и недействительности?
Откуда shopt получить результат?
Почему это не связано с $SHELL ?
sudo su
givinv@87-109:~$ sudo su
root@87-109:/home/givinv#
root@87-109:/home/givinv#
root@87-109:/home/givinv# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:/home/givinv# echo $SHELL
/bin/bash
root@87-109:/home/givinv#
root@87-109:/home/givinv# exit
givinv@87-109:~$
sudo su
givinv@87-109:~$ sudo -i
root@87-109:~#
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
Login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~#
sudo -s
root@87-109:~# sudo -s
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~#
Как объясняет @Serg в этом ответе о том, как определить, какую оболочку вы используете, переменная SHELL является только оболочкой текущего пользователя по умолчанию, прочитанной с /etc/passwd:
$ grep zanna /etc/passwd
zanna:x:1000:1000:Zanna,,,:/home/zanna:/bin/bash
, поэтому если I echo $SHELL всегда будет возвращать /bin/bash:
$ zsh
% echo $SHELL
/bin/bash
Независимо от того, является ли оболочка оболочкой входа, является ли опция оболочки определена во время запуска оболочки. Программа оболочки хранит эту информацию вместе со всеми ее другими настройками и переменными. Команда shopt предоставляет способ увидеть эту информацию и, если возможно, для данного параметра, установить или отключить ее (это не относится к login_shell, что, конечно, зависит от процесса, используемого для запуска оболочка)
Параметры программы sudo определяют, как будут запускаться эти разные типы корневой оболочки:
в этом ответе о том, как определить, в какой оболочке вы работаете
man bash:
Оболочка для входа - это тот, чей первый символ аргумента 0 - это -, или один из них начинается с опции --login.man login:
Оболочка для входа - это тот, чей первый символ аргумента нуль - это -, или один из них начинается с опции --login.
Значение для $HOME, $SHELL [...] задано в соответствии с соответствующими полями в записи пароля.
Оболочка - это оболочка входа, если он был вызван как оболочка входа. Переменная среды $SHELL устанавливается login или вызывающей программой, например su. Сама оболочка не устанавливает его. shopt показывает текущие варианты оболочки.