Почему $ SHELL не меняется при запуске новой оболочки?


14
 $ echo $SHELL
/bin/bash
 $ /bin/ksh93
 $ echo $SHELL
/bin/bash
 $ file /bin/ksh93
/bin/ksh93: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped

 $ getent passwd test111
test111:x:1008:1008:,,,:/tmp:/bin/ksh93
 $ ssh test@localhost
test@localhost's password:
 $ echo $SHELL
/bin/ksh93
 $ bash
 $ echo $SHELL
/bin/ksh93

Я ожидаю $SHELLизменения после запуска другой оболочки. Почему не так?

PS Однако оболочка меняется, только переменная $ SHELL остается неизменной:

 $ dash
 $ echo $SHELL
/bin/bash
 $ T=test ; [[ $T = *est ]] && echo ok
dash: [[: not found

2
использовать echo $0для получения текущей оболочки
Manula Waidyanatha

Ответы:


13

Вы не должны ожидать, что эта переменная изменится. Он используется для хранения пути к вашей оболочке по умолчанию, т.е. к той, которая хранится в базе данных паролей, а не к той оболочке, которую вы используете в данный момент.


8

SHELLэто определяется POSIX . Цитирование:

SHELL Эта переменная должна представлять путь к предпочтительному интерпретатору языка команд пользователя. [...]

Запуск другой оболочки не обязательно указывает на изменение предпочтений пользователя.

Полезно изучить типы вещей, которые определяет POSIX, и где их искать, поскольку большинство систем * .nix нацелены на соответствие POSIX. Переменные среды являются одной из таких вещей.


-3

Переменная SHELL хранит родительскую оболочку для вашего сеанса, которая иногда совпадает с вашей оболочкой входа по умолчанию . $ SHELL является родительской оболочкой, которая породила текущий сеанс.

Итак, если я использую bash для своего пользователя и делаю это: chsh -s /bin/zsh userкогда я это сделаю echo $SHELL, отображаемая оболочка все равно будет BASH.

см этой статьи .


4
Статья, на которую вы ссылаетесь, неверна. Это наоборот, т.е. SHELL хранит вашу оболочку входа по умолчанию (в последний раз), которая иногда совпадает с вашей родительской оболочкой. Эта переменная никогда не изменяется вашим родителем или текущей оболочкой. Единственное действие, которое они могут сделать, это установить его, если (неожиданно) не установлено.
Jlliagre
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.