Почему $ 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

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

jlliagre
источник
8

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

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

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

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

Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
источник
-3

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

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

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

fromnaboo
источник
4
Статья, на которую вы ссылаетесь, неверна. Это наоборот, т.е. SHELL хранит вашу оболочку входа по умолчанию (в последний раз), которая иногда совпадает с вашей родительской оболочкой. Эта переменная никогда не изменяется вашим родителем или текущей оболочкой. Единственное действие, которое они могут сделать, это установить его, если (неожиданно) не установлено.
Jlliagre