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), следовательно, происходит слияние значений.