新しいシェルを実行しても$ SHELLが変更されないのはなぜですか?

新しいシェルを実行しても$ SHELLが変更されないのはなぜですか?
 $ 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

答え1

この変数が変更されると予想してはいけません。現在実行中のシェルではなく、パスワードデータベースに格納されているパスであるプライマリシェルへのパスを保存するために使用されます。

答え2

SHELLはいPOSIXで指定。引用:

SHELL この変数は、ユーザーが好むコマンド言語ソルバーのパス名を表す必要があります。 [...]

別のシェルを実行しても必ずしもユーザー設定が変更されるわけではありません。

ほとんどの* .nixシステムはPOSIXと互換性があるように設計されているため、POSIXが指定する項目の種類とそれを検索する場所を知ることをお勧めします。環境変数もその一つです。

答え3

SHELL可変ストレージセッションの親シェル(時にはデフォルトのログインシェルと一致する)。 $ SHELLは現在のセッションを作成した親シェルです。

したがって、私のユーザーにbashを使用して次のことを行うと、これを実行したchsh -s /bin/zsh userときにecho $SHELL表示されるシェルはまだありますBASH

バラよりこの記事

関連情報