Trong thực tế, bạn đã đạt được đúng thuật ngữ¹. Có một biến môi trường SHLVLmà tất cả các shell tương tác chính (bash, tcsh, zsh) tăng thêm 1 khi chúng bắt đầu. Vì vậy, nếu bạn bắt đầu một vỏ trong vỏ, SHLVLtăng thêm 1.
Điều này không trực tiếp trả lời mối quan tâm của bạn, tuy nhiên, vì SHLVLmang những thứ như trình giả lập thiết bị đầu cuối. Ví dụ, trong cấu hình thông thường của tôi, $SHLVLlà 2 trong một xterm, vì cấp 1 tương ứng với trình bao chạy phiên X ( ~/.xinitrchoặc ~/.xsession) của tôi.
Những gì tôi làm là hiển thị $SHLVLtrong lời nhắc của mình, nhưng chỉ khi tiến trình cha của shell là một shell khác (với các heuristic như tên nếu tên của nó kết thúc bằng shdấu chấm câu và chữ số tùy chọn, thì đó là shell shell). Bằng cách đó, tôi có một dấu hiệu trực quan rõ ràng trong trường hợp không phổ biến của một vỏ chạy dưới vỏ khác.
Có lẽ bạn muốn phát hiện các shell đang chạy trực tiếp dưới một trình giả lập thiết bị đầu cuối. Bạn có thể làm điều này khá chính xác: đây là các trình bao có quá trình cha mẹ có một thiết bị đầu cuối kiểm soát khác nhau, do đó ps -o tty= -p$$và ps -o tty= -p$PPIDtạo ra đầu ra khác nhau. Bạn có thể đặt lại thủ công SHLVLthành 1 trong các shell này hoặc đặt riêng của bạn TERMSHLVLthành 1 trong các shell này (và tăng theo cách khác).
¹
Mặc dù người ta sẽ không nghĩ rằng nó nhìn vào trang hướng dẫn: không ai trong số ba vỏ có hỗ trợ nó bao gồm từ “trình độ” trong tài liệu hướng dẫn của họ SHLVL.