Я продолжаю читать об интерактивных, неинтерактивных, авторизационных и неавторизованных оболочках.
(Это в контексте того, какой из файлов .bash* читается).
Я не понимаю, что представляет собой каждый тип оболочки, поэтому давайте начнем с основ.
Если я подключаюсь по ssh с моего Mac к моей машине Ubuntu, какой тип оболочки запускается?
решение1
Если вы подключаетесь по SSH к вашему Ubuntu box, вы получаете интерактивную оболочку входа. Вот разница:
Интерактивный и неинтерактивный:Любая оболочка, в которой можно печатать в приглашении, является интерактивной. Фактически, многие скрипты проверяют переменную
$PS1
, которая содержит строку приглашения, чтобы выяснить, являются ли они интерактивными. Если оболочка выполняет скрипт оболочки, она неинтерактивна.Таким образом, если вы это сделаете
ssh yourbox.example.com
, вы получите интерактивную оболочку, предполагающую настройки по умолчанию, в то время как если вы это сделаетеssh yourbox.example.com mighty_shellscript.sh
, вы получите неинтерактивную оболочку, и ваш сеанс SSH будет завершен при завершении работы скрипта.Логин и не логин:Когда вы входите в систему с консоли или удаленно (например, SSH), или когда вы передаете опцию
-l
,bash
вы получаете оболочку входа. В противном случае — например, когда вы открываете окно терминала — вы получаете оболочку без входа.Чтобы проверить, является ли оболочка оболочкой входа, проверьте, указано ли
-bash
вместо нее имя командыbash
:ps -ef | grep [b]ash
решение2
Вы получаете интерактивную оболочку входа. Но не принимайте это как должное, проверьте сами.
Это говорит о том, что у вас есть оболочка входа (из man bash
):
# shopt | grep login
login_shell on
Это говорит о том, что у вас интерактивная оболочка, найдите i
(from man bash
):
# echo $-
himBH
Интерактивная оболочка входа в систему, которую вы получаете, прочитала /etc/profile
и один из ~/.bash_profile
, ~/.bash_login
и ~/.profile
, как объяснено в man bash
:
Когда bash вызывается как интерактивная оболочка входа, или как неинтерактивная оболочка с опцией --login,Сначала он считывает и выполняет команды из файла /etc/profile, если этот файл существует. После считывания этого файла он ищет ~/.bash_profile, ~/.bash_login и ~/.profile в указанном порядке, а затем считывает и выполняет команды из первого существующего и доступного для чтения. Для подавления такого поведения при запуске оболочки можно использовать опцию --noprofile.
решение3
Theсш(1)на странице руководства написано:
Есликомандауказан, он выполняется на удаленном хосте вместо оболочки входа.
и
Когда идентификация пользователя принята сервером, сервер либо выполняет заданную команду, либо входит в систему и предоставляет пользователю обычную оболочку на удаленной машине.
Это наводит меня на мысль, что оболочка, которую вы получаете, является оболочкой входа в систему.
решение4
Попробуйте эту команду.
[макс@localhost ~]$ echo $SHELL /bin/баш
Вы получаете этот вывод, потому что ваш тип оболочки хранится в этой переменной SHELL
.
Чтобы узнать переменную среды, введите эту команду
[макс@localhost ~]$ env . . . HOSTNAME=localhost.localdomain ОБОЛОЧКА=/bin/bash РАЗМЕР ИСТОРИИ=1000 ПОЛЬЗОВАТЕЛЬ=макс . . .
при вводе echo $SHELL
будет выведено значение, которое здесь хранится
Это значение обновляется при каждой загрузке.