ทำไมคุณถึงใช้ตัวแปร $ SHLVL Variable

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

Shell คืออะไร?

เปลือกใช้คำสั่งและให้พวกเขาไปยังระบบปฏิบัติการพื้นฐานที่จะดำเนินการ ในระบบลีนุกซ์ส่วนใหญ่โปรแกรมเชลล์เรียกว่า BASH (The Bourne Again Shell) แต่มีผู้ใช้อื่น ๆ เช่น C Shell (tcsh) และ KORN shell (ksh)

วิธีการเข้าถึง Linux Shell

โดยทั่วไปในฐานะผู้ใช้ที่คุณโต้ตอบกับโปรแกรม shell โดยใช้โปรแกรม จำลองเทอร์มินัล เช่น XTerm, konsole หรือ gnome-terminal

ถ้าคุณใช้ตัวจัดการหน้าต่างเช่น Openbox หรือเดสก์ท็อปเช่น GNOME หรือ KDE คุณจะพบเครื่องจำลองสถานีจากเมนูหรือรีบ ในหลายระบบทางลัด CTRL ALT และ T จะเปิดหน้าต่างเทอร์มินัลเช่นกัน

หรือคุณสามารถสลับไปยัง tty เครื่องอื่น (teletypewriter) ซึ่งให้การเข้าถึงโดยตรงกับเชลล์บรรทัดคำสั่ง คุณสามารถทำได้โดยการกด CTRL ALT และ F1 หรือ CTRL ALT และ F2 เป็นต้น

ระดับเชลล์คืออะไร

เมื่อคุณเรียกใช้คำสั่งในเชลล์จะทำงานในบางสิ่งที่เรียกว่าระดับเชลล์ ภายในเชลล์คุณสามารถเปิดเปลือกใหม่ซึ่งทำให้เป็นเปลือกย่อยหรือเปลือกที่เปิดได้

ดังนั้นเชลล์ของผู้ปกครองจะได้รับการพิจารณาว่าอาจจะเป็นเปลือกระดับ 1 และเปลือกสำหรับเด็กจะเป็นเปลือกระดับ 2

วิธีการแสดงระดับเชลล์

ควรมาเป็นอย่างแปลกใจไม่ขึ้นอยู่กับชื่อของบทความว่าวิธีที่คุณสามารถบอกได้ว่าระดับของเชลล์ที่คุณใช้คืออะไรโดยใช้ตัวแปร $ SHLVL

เมื่อต้องการดูระดับของเชลล์ที่คุณกำลังเรียกใช้อยู่ในประเภทต่อไปนี้:

echo $ SHLVL

ค่อนข้างน่าสนใจถ้าคุณเรียกใช้คำสั่งดังกล่าวในหน้าต่าง terminal ที่คุณอาจจะประหลาดใจที่เห็นว่าผลที่ได้คือ 2

อย่างไรก็ตามหากคุณใช้คำสั่งเดียวกันโดยใช้ tty ผลลัพธ์ก็คือ 1

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

TTY ไม่ได้รันระบบเดสก์ท็อปและดังนั้นจึงเป็นเพียงเปลือกระดับ 1 เท่านั้น

วิธีการสร้าง Subshells

วิธีที่ง่ายที่สุดในการทดสอบแนวคิดของเปลือกและเปลือกย่อยดังต่อไปนี้ เปิดหน้าต่างเทอร์มินัลและพิมพ์ข้อมูลต่อไปนี้:

echo $ SHLVL

ที่เรารู้จากหน้าต่างเทอร์มินัลระดับเปลือกต่ำสุดคือ 2

ตอนนี้ภายในหน้าต่าง terminal พิมพ์ต่อไปนี้:

ดวลจุดโทษ

คำสั่ง sh บนตัวเองรันเชลล์แบบโต้ตอบซึ่งหมายความว่าคุณใช้เปลือกภายในเชลล์หรือซับสเกล

ถ้าคุณพิมพ์ข้อความนี้อีกครั้ง:

echo $ SHLVL

คุณจะเห็นว่าระดับเปลือกถูกตั้งค่าเป็น 3 การเรียกใช้คำสั่ง sh จากภายใน subshell จะเปิด subshell ของ subshell และระดับของ shell จะอยู่ที่ระดับ 4

ทำไมระดับเชลล์จึงสำคัญ?

ระดับเปลือกมีความสำคัญเมื่อคิดถึงขอบเขตของตัวแปรภายในสคริปต์ของคุณ

เริ่มต้นด้วยสิ่งที่ง่าย:

สุนัข = ไมซี่
echo $ dog

ถ้าคุณเรียกใช้คำสั่งดังกล่าวในเชลล์ maisie คำจะถูกแสดงไปยังหน้าต่างเทอร์มินัล

เปิดเปลือกใหม่โดยพิมพ์ข้อความต่อไปนี้:

ดวลจุดโทษ

ถ้าคุณเรียกใช้คำสั่งนี้คุณจะเห็นว่าไม่มีอะไรที่จะถูกส่งกลับจริง:

echo $ dog

นั่นเป็นเพราะตัวแปร $ dog ใช้ได้เฉพาะในระดับ shell 2. ถ้าคุณพิมพ์ exit เพื่อออกจาก subshell และเรียกใช้ echo $ dog อีกครั้งคำว่า maisie จะปรากฏขึ้นอีกครั้ง

นอกจากนี้ยังควรคำนึงถึงพฤติกรรมของตัวแปรระดับโลกภายในเชลล์

เริ่มต้นในหน้าต่างเทอร์มินัลใหม่และพิมพ์ข้อมูลต่อไปนี้:

ส่งออกสุนัข = maisie
echo $ dog

ตามที่คุณคาดหวังว่าคำว่า maisie จะปรากฏขึ้น ตอนนี้เปิด subshell และพิมพ์ echo $ dog อีกครั้ง เวลานี้คุณจะเห็นว่ามีคำว่า maisie ปรากฏขึ้นแม้ว่าคุณจะอยู่ใน subshell

เหตุผลนี้คือคำสั่ง export ทำให้ตัวแปร $ dog เป็นตัวแปรระดับโลก การเปลี่ยนตัวแปร $ dog ภายในซับสเปเชียลแม้ว่าคุณจะใช้คำสั่ง export จะไม่ส่งผลกระทบต่อสกิลแม่แบบของมัน

หวังว่าจากนี้คุณจะเห็นว่ารู้ระดับเปลือกที่คุณกำลังทำงานในมีความสำคัญบางอย่างเมื่อเขียนสคริปต์

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