Я читал разницу между sudo -i/-s
здесь . После использования команды shopt
отмечается, что все ( sudo su/sudo -i/sudo -s
) $SHELL
предоставляют одинаковые результаты, но shopt
результаты команды разные.
Итак, как определяется логин и не логин оболочки?
Откуда shopt
взять результат?
Почему это не связано с $SHELL
?
судо су
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:~$
судо
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:~#
судо
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:~#
command-line
bash
sudo
Prado
источник
источник
.profile
или эквиваленты), и 2. Это оболочка, которая должна запускаться при входе в систему для пользователь, как определено в/etc/passwd
или эквивалентный.$SHELL
содержит последнее, вашиshopt
выходы имеют дело с первым. Обычно, когда оболочка в (2) запускается при входе в систему, она запускается особым образом, необходимым для (1), следовательно, происходит слияние значений.$SHELL
(и подключить ее к псевдотерминалу), которая, в свою очередь, определена в вашей записи / etc / passwd. эта оболочка является оболочкой входа в систему и может быть протестирована сif [[ -o login ]]; then echo "I am a login shell"; fi
. будучи оболочкой входа в систему, он будет выполнять те задачи, которые соответствуют новому сеансу. например, источник~/.zprofile
или аналог, который, возможно, установит переменные окружения и любой пользовательский код оболочки, который вы можете захотеть запустить в это времяОтветы:
TL; DR :
/etc/passwd
.sudo su
/sudo su -
/sudo -i
/ тоsudo -s
же самое? Нет, все они порождают раковину, но по-разному и в разных контекстах.$SHELL
? Просто укажите вашу оболочку по умолчанию, так же, как и в/etc/passwd
.Фактический ответ :
Прежде всего, важно упомянуть, что
shopt
это специфично для bash. Например, я являюсьmksh
пользователем оболочки, и его нетshopt
, какksh
нет.Далее, что именно
login_shell
должно представлять? Отman bash
:Это ключевой момент.
sudo -i
Как вы уже знаете из предыдущего прочитанного вами ответа, предполагается имитировать первоначальный вход в систему. Вот почемуshopt
отчетыlogin_shell on
по этой опции. Думайте об этом так, как будтоsudo -i
вынуждает оболочку проходить через файлы, которые должны появляться только во время входа в систему (которые не получают из интерактивных оболочек).В других случаях вы уже запускаете экземпляр оболочки, поэтому он не может быть оболочкой входа, во-первых, и назначение параметров другое.
sudo -s
просто читает$SHELL
(которая предназначена для представления вашей оболочки по умолчанию, как установлено/etc/passwd
) и запускает ее с привилегиями root. Это эквивалентно выполнениюsudo $SHELL
илиsudo mksh
илиsudo bash
(в зависимости от того, что вы используете).Помните, я упоминал, что я
mksh
пользователь? Взгляните на это:То, что вы видите, это то, что
sudo -s
выскочил изbash
моейmksh
оболочки с характерным для меня приглашением. И, конечно же, поскольку это не действие входа в систему,bash
оно сообщило бы, что оболочка порождена как экземпляр оболочки без входа в систему. В моем случае, однако, вы видите, что$-
там нет буквыl
, которая была бы там, если бы это был экземпляр оболочки входа в систему.Наконец, та же идея относится
sudo su
и кsudo su -
. Позже один порождает экземпляр оболочки входа в систему (т. Е. Будут запускаться определенные файлы, необходимые для входа в систему), а первый порождает только интерактивные оболочки (т. Е. Файлы входа в систему не запускаются).Так что технически
shopt login_shell
не имеет никакого отношения к$SHELL
чему бы то ни было. Подумайте об этом так: его цель - показать, как работает bash.$SHELL
должен отражать только то, что вы назначили в/etc/passwd
.Что касается различий между оболочкой входа в систему и оболочкой без регистрации, то в этом ответе она была объяснена уважаемым Жилем на unix.stackexchange.com .
Дополнительное веселье
Вот кое-что интересное, что вы можете попробовать. Как вы, возможно, уже знаете, будет запущена оболочка входа в систему
.profile
(а.bashrc
поскольку Ubuntu.profile
настроена для этого ), но ад, не входящий в систему, будет запускать только.bashrc
файл. Таким образом, мы можем проверить, сecho
какой из этих команд запускается оболочка входа в систему, а какая нет, и мы ожидаем две строкиecho
для оболочки входа в систему и только одну строку для отсутствия входа в систему.Соответственно, те с двумя строками вывода будут
login_shell
установлены вon
.источник
$SHELL
иlogin_shell/non-login_shell
уточнили. Но откудаshopt
взять подробности? Это изecho $0
?$0
используется для обозначения того, является ли оболочка оболочкой входа в систему, поэтому, еслиshopt
бы проверить эту переменную - конечно, это вполне приемлемо. Тем не менее, есть, вероятно, больше, чем кажется на первый взгляд.shopt
вероятно, на этот вопрос у меня нет точного ответа, так как я не очень хорошо знаком с исходным кодом bash.-
или используя-l
опцию.login_shell The shell sets this option if it is started as a login shell (see INVOCATION above). The value may not be changed.
что,shopt login_shell
похоже, bash позволяет вам узнать - программно, как узнать, как он был запущен. другой путь был бы[[ -o login ]]
Как @Serg объясняет в этом ответе о том, как определить, какую оболочку вы используете ,
SHELL
переменная - это просто оболочка текущего пользователя по умолчанию, считанная из/etc/passwd
:так что, если я
echo $SHELL
это всегда будет возвращать/bin/bash
:Будь или не оболочка является Войти оболочки, является ш флигель неавтоматического ионов определяется в момент запуска оболочки. Программа оболочки хранит эту информацию вместе со всеми другими настройками и переменными. Команда
shopt
предоставляет способ просмотреть эту информацию и, если возможно, для рассматриваемой опции, установить или отменить ее (это не тот случай, дляlogin_shell
которого, конечно, зависит от процесса, используемого для запуска оболочки)Параметры
sudo
программы определяют, как будут запускаться эти различные типы корневой оболочки:источник
shopt
иlogin_shell
должны представлять гораздо лучше, чем в моем ответе.man bash
:man login
:Короче говоря:
$SHELL
устанавливаетсяlogin
, например, вызывающей или вызывающей программойsu
. Сама оболочка не устанавливает его.shopt
показывает параметры оболочки в настоящее время в силе.источник