新しいシェルを実行しても$ 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

SHELLPOSIX指定されます。引用:

SHELLこの変数は、ユーザーの優先コマンド言語インタープリターのパス名を表します。[...]

別のシェルを実行しても、必ずしもユーザーの設定が変更されたとは限りません。

ほとんどの* .nixシステムはPOSIX準拠を目的としているため、POSIXが指定するものの種類とそれらを検索する場所を学ぶことは有益です。環境変数はそれらの1つです。


-3

SHELL変数には、セッションの親シェルが格納されます。これは、デフォルトのログインシェルと一致する場合があります。$ SHELLは、現在のセッションを生成した親シェルです。

そのため、ユーザーにbashを使用してこれchsh -s /bin/zsh userを実行するecho $SHELLと、を実行しても、表示されるシェルはになりますBASH

この記事を参照してください


4
リンクする記事が正しくありません。これは逆の方法です。つまり、SHELLは、親シェルと一致することがあるデフォルトのログインシェル(最後のログイン時間)を保存します。この変数は、親または現在のシェルによって変更されることはありません。彼らが行う唯一のアクションは、(予期せずに)設定されていない場合に設定することです。
jlliagre
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.