Trong thực tế, bạn đã đạt được đúng thuật ngữ¹. Có một biến môi trường SHLVL
mà 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ỏ, SHLVL
tă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ì SHLVL
mang 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, $SHLVL
là 2 trong một xterm, vì cấp 1 tương ứng với trình bao chạy phiên X ( ~/.xinitrc
hoặc ~/.xsession
) của tôi.
Những gì tôi làm là hiển thị $SHLVL
trong 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 sh
dấ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$PPID
tạo ra đầu ra khác nhau. Bạn có thể đặt lại thủ công SHLVL
thành 1 trong các shell này hoặc đặt riêng của bạn TERMSHLVL
thà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
.