TL; DR :
- Где определена оболочка входа? В
/etc/passwd.
- А
sudo su/ sudo su -/ sudo -i/ то sudo -sже самое? Нет, все они порождают раковину, но по-разному и в разных контекстах.
- Что делает
$SHELL? Просто укажите вашу оболочку по умолчанию, так же, как и в /etc/passwd.
Фактический ответ :
Прежде всего, важно упомянуть, что shoptэто специфично для bash. Например, я являюсь mkshпользователем оболочки, и его нет shopt, как kshнет.
Далее, что именно login_shellдолжно представлять? От man bash:
login_shell
Оболочка устанавливает эту опцию, если она запускается как оболочка входа
Это ключевой момент. sudo -iКак вы уже знаете из предыдущего прочитанного вами ответа, предполагается имитировать первоначальный вход в систему. Вот почему shoptотчеты login_shell on по этой опции. Думайте об этом так, как будто sudo -iвынуждает оболочку проходить через файлы, которые должны появляться только во время входа в систему (которые не получают из интерактивных оболочек).
В других случаях вы уже запускаете экземпляр оболочки, поэтому он не может быть оболочкой входа, во-первых, и назначение параметров другое. sudo -sпросто читает $SHELL(которая предназначена для представления вашей оболочки по умолчанию, как установлено /etc/passwd) и запускает ее с привилегиями root. Это эквивалентно выполнению sudo $SHELLили sudo mkshили sudo bash(в зависимости от того, что вы используете).
Помните, я упоминал, что я mkshпользователь? Взгляните на это:
$ bash --posix
bash-4.3$ sudo -s
[sudo] password for xieerqi:
DIR:/xieerqi|01:53|skolodya@ubuntu:
$ id
uid=0(root) gid=0(root) groups=0(root)
DIR:/xieerqi|01:53|skolodya@ubuntu:
$ echo $-
imsU
То, что вы видите, это то, что sudo -sвыскочил из bashмоей mkshоболочки с характерным для меня приглашением. И, конечно же, поскольку это не действие входа в систему, bashоно сообщило бы, что оболочка порождена как экземпляр оболочки без входа в систему. В моем случае, однако, вы видите, что $-там нет буквы l, которая была бы там, если бы это был экземпляр оболочки входа в систему.
Наконец, та же идея относится sudo suи к sudo su -. Позже один порождает экземпляр оболочки входа в систему (т. Е. Будут запускаться определенные файлы, необходимые для входа в систему), а первый порождает только интерактивные оболочки (т. Е. Файлы входа в систему не запускаются).
bash-4.3$ sudo su
[sudo] password for xieerqi:
root@eagle:/home/xieerqi# shopt login_shell
login_shell off
root@eagle:/home/xieerqi# exit
bash-4.3$ sudo su -
[sudo] password for xieerqi:
$ shopt login_shell
login_shell on
Так что технически shopt login_shellне имеет никакого отношения к $SHELLчему бы то ни было. Подумайте об этом так: его цель - показать, как работает bash. $SHELLдолжен отражать только то, что вы назначили в /etc/passwd.
Что касается различий между оболочкой входа в систему и оболочкой без регистрации, то в этом ответе она была объяснена уважаемым Жилем на unix.stackexchange.com .
Дополнительное веселье
Вот кое-что интересное, что вы можете попробовать. Как вы, возможно, уже знаете, будет запущена оболочка входа в систему .profile(а .bashrcпоскольку Ubuntu .profile настроена для этого ), но ад, не входящий в систему, будет запускать только .bashrcфайл. Таким образом, мы можем проверить, с echoкакой из этих команд запускается оболочка входа в систему, а какая нет, и мы ожидаем две строки echoдля оболочки входа в систему и только одну строку для отсутствия входа в систему.
$ echo "echo 'hi,i am .profile'" >> .profile
$ echo "echo 'hi, i am .bashrc'" >> .bashrc
$ sudo -i
hi, i am .bashrc
hi,i am .profile
$ sudo su
hi, i am .bashrc
root@eagle:~# sudo su -
hi, i am .bashrc
hi,i am .profile
$ sudo -s
hi, i am .bashrc
root@eagle:~#
Соответственно, те с двумя строками вывода будут login_shellустановлены в on.
.profileили эквиваленты), и 2. Это оболочка, которая должна запускаться при входе в систему для пользователь, как определено в/etc/passwdили эквивалентный.$SHELLсодержит последнее, вашиshoptвыходы имеют дело с первым. Обычно, когда оболочка в (2) запускается при входе в систему, она запускается особым образом, необходимым для (1), следовательно, происходит слияние значений.