Làm thế nào và tại sao bạn sẽ sử dụng biến $ SHLVL

Biến $ SHLVL được sử dụng để cho bạn biết bạn có bao nhiêu sâu. Nếu bạn đang bối rối bởi điều này nó có giá trị bắt đầu từ đầu.

Shell là gì?

Một trình bao lấy lệnh và đưa chúng vào hệ điều hành cơ bản để thực hiện. Trên hầu hết các hệ thống Linux, chương trình shell được gọi là BASH (The Bourne Again Shell) nhưng có những chương trình khác bao gồm C Shell (tcsh) và KORN shell (ksh).

Cách truy cập Shell Linux

Nói chung là người dùng bạn tương tác với chương trình shell thông qua việc sử dụng chương trình mô phỏng thiết bị đầu cuối như XTerm, konsole hoặc gnome-terminal.

Nếu bạn đang chạy trình quản lý cửa sổ như Openbox hoặc môi trường máy tính để bàn như GNOME hoặc KDE, bạn sẽ tìm thấy trình giả lập thiết bị đầu cuối hoặc từ trình đơn hoặc dấu gạch ngang. Trên nhiều hệ thống, phím tắt CTRL ALT và T sẽ mở một cửa sổ đầu cuối.

Ngoài ra, bạn có thể chuyển sang một tty (teletypewriter) khác cung cấp truy cập trực tiếp vào một shell dòng lệnh. Bạn có thể làm điều này bằng cách nhấn CTRL ALT và F1 hoặc CTRL ALT và F2, v.v.

Cấp độ vỏ là gì

Khi bạn chạy một lệnh trong một trình bao nó chạy ở một cái gì đó gọi là mức độ vỏ. Trong một trình bao, bạn có thể mở một trình bao khác làm cho nó trở thành một vỏ con hoặc vỏ mở nó ra.

Do đó, shell cha sẽ được xem là có lẽ shell level 1 và shell con sẽ là một shell level 2.

Làm thế nào để hiển thị mức độ Shell

Nó sẽ đến như là không có bất ngờ dựa trên tiêu đề của bài viết mà cách bạn có thể cho biết mức độ vỏ bạn đang chạy là bằng cách sử dụng biến $ SHLVL.

Để xem mức độ vỏ mà bạn hiện đang chạy trong loại sau:

echo $ SHLVL

Khá thú vị nếu bạn chạy lệnh trên trong một cửa sổ đầu cuối, bạn có thể ngạc nhiên khi thấy kết quả trả về là 2.

Tuy nhiên, nếu bạn chạy cùng lệnh bằng tty thì kết quả là 1.

Tại sao đây là trường hợp bạn có thể hỏi? Vâng môi trường máy tính để bàn bạn đang chạy đang được chạy trên một vỏ. Vỏ đó sẽ là cấp 1. Bất kỳ cửa sổ đầu cuối nào bạn mở từ bên trong môi trường máy tính để bàn đó phải là một phần tử con của shell đã mở môi trường máy tính để bàn và do đó mức vỏ không thể bắt đầu ở bất kỳ số nào khác ngoài 2.

Tty không chạy một môi trường máy tính để bàn và do đó chỉ đơn giản là một trình bao cấp 1.

Cách tạo Subshells

Cách dễ nhất để kiểm tra khái niệm vỏ và subshells là như sau. Mở cửa sổ dòng lệnh và nhập như sau:

echo $ SHLVL

Như chúng ta đã biết từ một cửa sổ đầu cuối, mức shell tối thiểu là 2.

Bây giờ trong cửa sổ terminal gõ như sau:

sh

Lệnh sh tự chạy một shell tương tác có nghĩa là bạn đang sử dụng một shell trong một shell hoặc một subshell.

Nếu bây giờ bạn gõ lại điều này:

echo $ SHLVL

Bạn sẽ thấy rằng mức shell được thiết lập là 3. Chạy lệnh sh từ bên trong subshell sẽ mở một subshell của subshell và vì vậy mức shell sẽ ở mức 4.

Tại sao mức Shell lại quan trọng?

Mức độ vỏ là quan trọng khi suy nghĩ về phạm vi của các biến trong kịch bản của bạn.

Hãy bắt đầu với một cái gì đó đơn giản:

dog = maisie
echo $ dog

Nếu bạn chạy lệnh trên trong trình bao, từ maisie sẽ được hiển thị ở cửa sổ đầu cuối.

Mở một trình bao mới bằng cách gõ như sau:

sh

Nếu bạn chạy lệnh này, bạn sẽ thấy rằng không có gì thực sự được trả về:

echo $ dog

Đó là vì biến $ dog chỉ có sẵn ở cấp độ shell 2. Nếu bạn gõ exit để thoát khỏi subshell và chạy echo $ dog một lần nữa từ maisie sẽ được hiển thị lại.

Nó cũng đáng suy nghĩ về hành vi của các biến toàn cục trong một trình bao.

Bắt đầu trong một cửa sổ terminal mới và gõ như sau:

chó xuất khẩu = maisie
echo $ dog

Như bạn mong đợi từ maisie được hiển thị. Bây giờ mở một subshell và gõ echo $ dog một lần nữa. Lần này bạn sẽ thấy từ maisie được hiển thị ngay cả khi bạn đang ở trong một subshell.

Lý do cho điều này là lệnh export đã tạo ra biến $ dog toàn cầu. Thay đổi biến $ dog trong subshell ngay cả khi bạn sử dụng lệnh export không ảnh hưởng đến các shell cha của nó.

Hy vọng rằng từ điều này bạn có thể thấy rằng biết mức độ vỏ mà bạn đang làm việc có một số ý nghĩa khi viết kịch bản.

Các ví dụ tôi đã đưa ra rất đơn giản nhưng nó khá phổ biến đối với một kịch bản lệnh shell để gọi một kịch bản lệnh shell khác mà lần lượt gọi một kịch bản lệnh shell khác hiện đang chạy ở các cấp độ khác nhau. Biết mức độ vỏ có thể rất quan trọng.