새 쉘을 실행할 때 $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

SHELLPOSIX에 의해 지정됨. 인용하다:

SHELL 이 변수는 사용자가 선호하는 명령 언어 해석기의 경로 이름을 나타내야 합니다. [...]

다른 셸을 실행한다고 해서 반드시 사용자 기본 설정이 변경되는 것은 아닙니다.

대부분의 *.nix 시스템은 POSIX와 호환되도록 설계되었으므로 POSIX가 지정하는 항목 유형과 이를 검색할 위치를 아는 것이 좋습니다. 환경변수도 그 중 하나입니다.

답변3

SHELL 가변 스토리지세션의 상위 셸(때로는 기본 로그인 셸과 일치함). $SHELL은 현재 세션을 생성한 상위 쉘입니다.

따라서 내 사용자에 대해 bash를 사용하고 다음을 수행하면 chsh -s /bin/zsh user이 작업을 수행할 때 echo $SHELL표시되는 쉘은 여전히 ​​입니다 BASH.

바라보다이 기사.

관련 정보