ฉันจะตรวจสอบเปลือกที่ฉันใช้อยู่ได้อย่างไร


357

ฉันอ่านเทอร์มินัลนั้นไม่มีอะไรนอกจากเปลือกและ Unix ให้รสชาติที่แตกต่างของเปลือก:

  • เชลล์เป้าหมาย (sh)
  • C เชลล์ (csh)
  • TC เชลล์ (tcsh)
  • Korn เชลล์ (ksh)
  • Bourne Again shell (ทุบตี)

คำถาม:

  • เมื่อฉันเปิดหน้าต่างเทอร์มินัลเชลล์ใดที่เปิดโดยค่าเริ่มต้น
  • ฉันจะตรวจสอบจำนวนเชลล์ที่ติดตั้งได้อย่างไร
  • ฉันจะเปลี่ยนเชลล์ที่ใช้จากบัญชีของฉันได้อย่างไร


@KasiyA นี้เกี่ยวข้องกับaskubuntu.com/questions/87853/…
daisy

โปรดทราบว่าเทอร์มินัลคือส่วนต่อประสานกับเชลล์ (ซึ่ง ณ จุดหนึ่งเคยใช้เป็นส่วนต่อประสานทางกายภาพจริง ๆ ) และเชลล์ไม่ใช่เทอร์มินัล - เป็นตัวแปลคำสั่ง ดูเพิ่มเติมaskubuntu.com/a/640105/295286
Sergiy Kolodyazhnyy

คำตอบ:


427

คุณสามารถพิมพ์คำสั่งต่อไปนี้ในเทอร์มินัลเพื่อดูว่าคุณใช้เชลล์อะไร:

echo $0

ผลลัพธ์จะมีลักษณะคล้ายกับด้านล่างหากคุณกำลังใช้เทอร์มินัลbash ( Bourne Again Shell ):

-bash

2
เป็น0ตัวแปรสภาพแวดล้อม?
Mi_Onim

43
@Mi_Onim $ 0 เป็นชื่อของกระบวนการทำงาน หากคุณใช้ภายในเชลล์แล้วมันจะส่งคืนชื่อของเชลล์ หากคุณใช้ภายในสคริปต์มันจะเป็นชื่อของสคริปต์
kingmilo

2
หมายเหตุ : cshนี้จะไม่ทำงานสำหรับการโต้ตอบ % echo $0 No file for $0.แต่มันใช้ได้กับtcsh
Sergiy Kolodyazhnyy

2
ไม่ทำงานหากมี symlink เช่นเดียวbashกับsh
Anwar

9
@Anwar ทำให้เป็นจุดที่ดีหลังจากที่คุณได้รับชื่อเปลือกจากecho $0, ls -l `which <name>` เพื่อดูว่ามันจะ symlinked ไบนารีเปลือกอีก
JivanAmara

121

ในการค้นหาเชลล์ที่คุณมีบนสภาวะแวดล้อมดีฟอลต์คุณสามารถตรวจสอบค่าของSHELLตัวแปรสภาวะแวดล้อม:

echo $SHELL

ในการค้นหาอินสแตนซ์เชลล์ปัจจุบันให้มองหากระบวนการ (เชลล์) ที่มี PID ของอินสแตนซ์เชลล์ปัจจุบัน

ในการค้นหา PID ของอินสแตนซ์ปัจจุบันของเชลล์:

echo "$$"

ตอนนี้เพื่อค้นหากระบวนการที่มี PID:

ps -p <PID>

วางไว้ด้วยกัน:

ps -p "$$"

27
$ SHELL เป็นเชลล์เริ่มต้นสำหรับระบบ (หรือผู้ใช้) ซึ่งโดยปกติจะเป็น (แต่ไม่จำเป็น) เชลล์ที่ใช้งานจริงในเวลาใดก็ตาม
kingmilo

1
@kingmilo: ใช่แล้วตอบแก้ไข
heemayl

ฉันพบว่ามันมีประโยชน์มากเมื่อเปลี่ยนเป็นผู้ใช้ผ่าน 'su - <username>' เช่นการตั้งค่า postgres, jenkins, ...
bully

1
echo $SHELLให้ฉัน/bin/cshและให้ฉันps -p $$ 22673 pts/1 00:00:00 bashKingmilo อธิบายว่าทำไมพวกเขาถึงไม่เหมือนกัน (ด้านบน)
18446744073709551615

@ 18446744073709551615 ฉันยังไม่ได้บอกว่าพวกเขาเหมือนกัน โปรดอ่านคำตอบอย่างละเอียดอีกครั้ง บันทึกการเริ่มต้นและคำปัจจุบัน
heemayl

25

$SHELLให้เชลล์เริ่มต้นแก่คุณ $0ให้เชลล์ปัจจุบันแก่คุณ

ตัวอย่างเช่นฉันมี bash เป็นเชลล์เริ่มต้นซึ่งฉันใช้สำหรับแอป Terminal ของฉัน แต่สำหรับแอปพลิเค iTerm2 /bin/kshของฉันฉันใช้คำสั่งเป็นหน้าต่างเปิด:

ดังนั้นฉัน $0ให้ฉัน/bin/kshใน iTerm2 $SHELLให้ฉัน/bin/bashใน iTerm2 $0, $SHELLให้ฉัน/bin/bashในเทอร์มิ


2
นี่เป็นความเข้าใจที่คลาดเคลื่อนของคำตอบที่ได้รับการโหวตมากที่สุด ขอขอบคุณ.
Michael Hoffmann

สำหรับฉันฉันได้ติดตั้ง zsh และมันเป็นค่าเริ่มต้นปัจจุบันเพื่อเปลี่ยนเป็นทุบตีสิ่งที่ฉันต้องทำbashในเทอร์มินัล หากต้องการเปลี่ยนกลับเป็น zsh ให้พิมพ์zsh
Yousuf Azad

8

หากต้องการทราบว่าเป็นเชลล์เริ่มต้นสำหรับผู้ใช้ของคุณคุณสามารถเรียกใช้:

echo "$SHELL"

ตัวอย่างเช่นถ้าคุณใช้ Bash คุณควรได้ผลลัพธ์ต่อไปนี้:

/bin/bash

หากคุณไม่ได้เปลี่ยนการกำหนดค่าใด ๆ ควรเป็น Bash เนื่องจาก Bash เป็นเชลล์เริ่มต้นบน Ubuntu


/ bin / sh เป็นภาษาคำสั่งของเชลล์และไม่ใช่ Bourne Shell โปรดแก้ไขคำตอบของคุณ
kingmilo

@kingmilo มีไม่มี/bin/shการอ้างอิงในคำตอบของฉัน
คอส

@ kol มีก่อนแก้ไข โปรดทราบว่า $ SHELL เป็นเชลล์เริ่มต้นสำหรับระบบ (หรือผู้ใช้) ซึ่งโดยปกติ (แต่ไม่จำเป็น) เชลล์ที่ใช้งานจริงในช่วงเวลาใดก็ตาม
kingmilo

1
@kingmilo การอ่านคำตอบอีกครั้งฉันคิดว่าฉันเข้าใจว่าอะไรคือสิ่งที่คุณกังวล ฉันชี้แจงความหมายของคำว่า "ปัจจุบัน" ในคำตอบของฉัน
kos

1
@frederickjh fish เป็นบิตหนึ่งที่แปลก $$ตัวแปรที่เป็นจริงที่กำหนดโดย POSIXและจะทำงานในส่วนใหญ่ของเปลือกหอย ปลาตัดสินใจที่จะไม่ทำตามมาตรฐานที่นี่ดังนั้นฉันคิดว่ามันยุติธรรมที่จะไม่สนใจมัน ฉันสามารถยืนยันได้ว่า$$ทำงานได้ตามที่คาดหวังใน sh, dash, bash, zsh, ksh, ash, tcsh และ csh ที่จริงแล้วฉันไม่สามารถนึกถึงเปลือกหอยอื่นใดได้นอกจากหัวปลาซึ่งมันใช้งานไม่ได้
terdon

8

คำตอบอื่น ๆ มักจะใช้คุณสมบัติเฉพาะของเชลล์ แต่เราพยายามค้นหาเชลล์ที่เราใช้อยู่ดังนั้นพวกเขาจึงถือว่าคำตอบของปัญหา ตัวอย่างเช่นไม่มีคำตอบใด ๆ ที่จะทำงานกับปลา

sh -c 'ps -p $$ -o ppid=' | xargs ps -o comm= -p

ใช้ไวยากรณ์ $$ แทนการเรียกใช้ sh แต่จากนั้นเรากำลังมองหา PPID ไม่ใช่ PID ใช้ PPID เพื่อหาคำสั่ง

sh -c 'ps -p $$ -o ppid=' | xargs -I'{}' readlink -f '/proc/{}/exe'

ขอบคุณสำหรับการปรับปรุง @muru


2
คุณสามารถใช้ppid=/ cmd=เพื่อละเว้นส่วนหัว (และอื่น ๆtail -1) และพิจารณา/proc/.../exeดูเพื่อดูว่าไฟล์ใดถูกเรียกใช้ (เนื่องจากcmdเอาต์พุตสามารถจัดการได้โดยสิ่งใดก็ตามที่วิ่งเชลล์)
muru

1
เห็นได้ชัดว่าสิ่งนี้ไม่ทำงานใน busybox เนื่องจากไม่ปฏิบัติตาม posix: อ้างอิง: github.com/broadinstitute/cromwell/pull/ …
Evan Benn

4

โพสต์ต้นฉบับถามคำถามสามข้อ คำตอบที่ให้นั้นครอบคลุมคำถามแรก "เมื่อฉันเปิดหน้าต่างเทอร์มินัลเชลล์ใดที่เปิดโดยค่าเริ่มต้น" พวกเขายังตอบคำถามที่ไม่ได้ถามคือ "ฉันจะทราบได้อย่างไรว่าเชลล์ตัวใดที่กำลังทำงานอยู่ในเครื่องเทอร์มินัล" อย่างไรก็ตามเท่าที่ฉันจะเห็นว่าไม่มีใครตอบคำถามที่สองหรือสามอย่างแรกที่ถามคือ "ฉันจะตรวจสอบว่ามีการติดตั้งเชลล์จำนวนเท่าใด?" และ "ฉันจะเปลี่ยนเชลล์ที่ใช้จากบัญชีของฉันได้อย่างไร"

  • ในการตอบ "ฉันจะตรวจสอบจำนวนเปลือกที่ติดตั้งได้อย่างไร" คำสั่งต่อไปนี้จะแสดงรายการเชลล์ที่มีอยู่ทั้งหมด:

cat / etc / shells

ตัวอย่างเช่นในการติดตั้งเริ่มต้นของ Ubuntu 18.10 สิ่งนี้จะให้:

# / etc / shells: เชลล์ล็อกอินที่ถูกต้อง

bin / sh /

/ bin / ประ

/ bin / ทุบตี

/ bin / rbash

อย่างไรก็ตามโดยค่าเริ่มต้น sh คือลิงก์สัญลักษณ์ไปยังเส้นประในขณะที่ rbash ลิงก์ไปยัง bash ด้วยตัวเลือก -r ("จำกัด bash") ดังนั้นจริงๆแล้วมีเพียงสองเชลล์เท่านั้นไม่ใช่สี่ตัวตามรายการข้างต้น คำสั่งต่อไปนี้จะแสดงให้คุณเห็นว่าเชลล์ใด ๆ ในรายการมีอยู่ในลิงก์สัญลักษณ์จริงหรือไม่และหากเป็นเช่นนั้นลิงก์เหล่านั้นไปที่: ls -l / bin

  • ตอนนี้สำหรับคำถาม "ฉันจะเปลี่ยนเชลล์ที่ใช้จากบัญชีของฉันได้อย่างไร" สมมติว่านี้หมายถึง "ฉันจะทำอย่างไรถาวรเปลี่ยนเปลือกเริ่มต้นที่สถานีจะใช้" มีคำตอบที่https://wiki.ubuntu.com/ChangingShells#Changing_your_login_shell_which_is_permanent
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.