เหตุใด $ 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

SHELLจะถูกกำหนดโดย POSIX พิเศษ:

SHELL ตัวแปรนี้จะแสดงชื่อพา ธ ของล่ามภาษาคำสั่งที่ผู้ใช้ต้องการ [ ... ]

การรันเชลล์ที่แตกต่างนั้นไม่จำเป็นต้องบ่งบอกถึงการเปลี่ยนแปลงในการตั้งค่าของผู้ใช้

เป็นการดีที่จะเรียนรู้ประเภทของสิ่งต่าง ๆ ที่ POSIX ระบุและตำแหน่งที่จะค้นหาสิ่งเหล่านั้นเนื่องจากระบบ * .nix ส่วนใหญ่มีจุดมุ่งหมายเพื่อให้สอดคล้องกับ POSIX ตัวแปรสภาพแวดล้อมเป็นหนึ่งในสิ่งเหล่านั้น


-3

เปลือกร้านค้าตัวแปรเปลือกแม่ของเซสชั่นของคุณซึ่งบางครั้งตรงกับเปลือกเข้าสู่ระบบเริ่มต้นของคุณ $ SHELL เป็นพาเรนต์เชลล์ซึ่งสร้างเซสชันปัจจุบัน

ดังนั้นหากใช้ i ทุบตีสำหรับผู้ใช้ของฉันและทำเช่นนี้: chsh -s /bin/zsh userเมื่อผมทำเปลือกที่แสดงจะยังคงเป็นecho $SHELLBASH

ดูบทความนี้


4
บทความที่คุณลิงก์ไปนั้นไม่ถูกต้อง นั่นเป็นอีกวิธีหนึ่งนั่นคือ SHELL เก็บเชลล์การเข้าสู่ระบบเริ่มต้นของคุณ (ในเวลาล็อกอินครั้งสุดท้าย) ซึ่งบางครั้งตรงกับเชลล์พาเรนต์ของคุณ ตัวแปรนี้ไม่เคยถูกแก้ไขโดยพาเรนต์หรือเชลล์ปัจจุบันของคุณ การกระทำเดียวที่พวกเขาอาจทำได้คือการตั้งค่าหากไม่ได้ตั้งค่า (โดยไม่คาดคิด)
jlliagre
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.