Tại sao $ SHELL không thay đổi khi tôi chạy shell mới?


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

Tôi hy vọng sẽ $SHELLthay đổi sau khi chạy một shell khác. Tại sao không?

PS Tuy nhiên, shell không thay đổi, chỉ có biến $ SHELL vẫn giữ nguyên:

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

2
sử dụng echo $0để có được vỏ hiện tại
Manula Waidyanatha

Câu trả lời:


13

Bạn không nên mong đợi biến này thay đổi. Nó được sử dụng để lưu trữ đường dẫn đến shell mặc định của bạn, tức là đường dẫn được lưu trữ trong cơ sở dữ liệu mật khẩu, không phải là shell nào bạn đang chạy.


8

SHELLđược chỉ định bởi POSIX . Trích dẫn:

SHELL Biến này sẽ đại diện cho một tên đường dẫn của trình thông dịch ngôn ngữ lệnh ưa thích của người dùng. [...]

Chạy một lớp vỏ khác nhau không nhất thiết chỉ ra sự thay đổi trong sở thích của người dùng.

Thật tốt khi tìm hiểu các loại điều mà POSIX chỉ định và nơi tìm kiếm chúng vì hầu hết các hệ thống * .nix đều nhắm đến việc tuân thủ POSIX. Biến môi trường là một trong những điều đó.


-3

Biến SHELL lưu trữ shell cha cho phiên của bạn, đôi khi khớp với vỏ đăng nhập mặc định của bạn . $ SHELL là trình bao cha mẹ sinh ra phiên hiện tại.

vì vậy, nếu tôi sử dụng bash cho người dùng của mình và làm điều này : chsh -s /bin/zsh user, khi tôi làm echo $SHELL, trình bao hiển thị sẽ vẫn còn BASH.

thấy bài viết này .


4
Bài viết bạn liên kết đến không chính xác. Đó là cách khác, tức là SHELL lưu trữ vỏ đăng nhập mặc định của bạn (tại lần đăng nhập cuối cùng) đôi khi khớp với vỏ cha mẹ của bạn. Biến này không bao giờ được sửa đổi bởi cha mẹ hoặc shell hiện tại của bạn. Hành động duy nhất họ có thể làm là thiết lập nó nếu (không mong đợi) không được đặt.
jlliagre
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.