Làm thế nào để biết cấp độ vỏ sò của tôi đang ở đâu?


32

Nếu tôi mở một thiết bị đầu cuối như xtermtôi sẽ có một vỏ. Sau đó, nếu tôi sử dụng sshhoặc zshtôi sẽ có một "cấp độ" khác của vỏ. Có cách nào để biết tôi phải Ctrl+Dgõ hoặc gõ bao nhiêu lần exitđể thoát khỏi tất cả chúng không? Ý định thực sự của tôi là thoát khỏi mọi thứ trừ cái vỏ "root".

Cũng sẽ rất tuyệt nếu biết bộ ghép kênh đầu cuối (như screen) có tác dụng gì đối với giải pháp.

Tái bút: Xin vui lòng thay đổi tiêu đề, tôi không biết nếu đó là những điều khoản chính xác.

Câu trả lời:


6

Một cách (thừa nhận là không hoàn hảo) là thêm kết quả ps --no-headers -o comm $PPIDvào dấu nhắc shell của bạn. Điều này sẽ cho bạn biết tên của quá trình sinh ra vỏ của bạn. Nếu bạn đang ở trong một zsh lồng nhau, nó sẽ nói "zsh". Nếu bạn đang ở trong một zsh cấp cao nhất, nó sẽ đọc "xterm" hoặc "màn hình" hoặc bất cứ thứ gì vỏ của bạn đang chạy.

Để biết bạn đang ở trong một phiên ssh hay su, bạn chỉ cần nhìn vào tên máy chủ và tên người dùng trong lời nhắc của bạn.

Khi bạn đang chạy màn hình lồng nhau (mà tôi không tưởng tượng là tình huống phổ biến), không có cách nào tôi có thể nghĩ để biết liệu bạn đang ở trong lớp vỏ cao nhất của màn hình lồng nhau hay lớp vỏ cấp cao nhất của màn hình cấp cao nhất. Bạn có thể định cấu hình màn hình để luôn hiển thị một dòng trạng thái, điều này sẽ khiến nhiều dòng trạng thái được hiển thị, nếu bạn đang ở trong các màn hình lồng nhau.


Aaah ... chụp .. đánh tôi với nó. :) +1
Stefan

Hiện tại tôi đang dùng mac và lệnh đã cho tôi biết ps: illegal option -- -, tại sao không? Tôi sẽ sớm kiểm tra lại trong Linux :)
phunehehe

3
@phunehehe: --option-namechủ yếu là các tính năng dành riêng cho GNU, do đó hầu như không có sẵn trong các tiện ích hệ thống tiêu chuẩn ngoài Linux. Nhưng bạn có thể nhận được hiệu ứng của ps --no-headersportable bằng cách thêm =sau tên cột. Ngoài ra, commcột không phải là POSIX, mà là cmdcột (bao gồm các đối số của lệnh). Cũng -pcần thiết trước khi cú pháp PID trong cú pháp POSIX. Do đó ps -o cmd= -p $PPIDlà di động và cung cấp thông tin tương tự.
Gilles 'SO- ngừng trở nên xấu xa'

đã xác nhận, hoạt động trên Gentoo
phunehehe

2
@phunehehe: xin lỗi, tôi đã mắc lỗi trong nhận xét trên. Trong thực tế, commcột được chỉ định bởi POSIX và được ghi lại trên Mac OS X, trong khi cmdcột tồn tại trên Linux nhưng không phải là tiêu chuẩn.
Gilles 'SO- ngừng trở nên xấu xa'

37

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$$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.


Cảm ơn đã xác nhận thuật ngữ. Tôi vẫn đang dùng mac và ngạc nhiên khi thấy 2 lệnh đó cho kết quả như nhau, bất kể mức độ vỏ của tôi.
phunehehe

@phunehehe: 2 lệnh gì? Nếu bạn muốn nói ps -o tty= -p$pid, điều này cho thấy thiết bị đầu cuối kiểm soát của quá trình, xác định trình giả lập thiết bị đầu cuối (xterm, screen, sshd, trộm) mà quy trình đang chạy. Nó sẽ không thay đổi nếu bạn khởi động shell từ shell khác, nhưng sẽ thay đổi nếu bạn bắt đầu một trình giả lập thiết bị đầu cuối mới. Nếu trình giả lập thiết bị đầu cuối là một ứng dụng Mac gốc, có thể có một sự tinh tế dành riêng cho Mac mà tôi không biết.
Gilles 'SO- ngừng trở nên xấu xa'

ps -o tty= -p$$ ps -o tty= -p$PPID , bởi vì bạn nói rằng họ nên sản xuất đầu ra khác nhau. Hay tôi đã hiểu nhầm điều gì?
phunehehe

@phunehehe: Chúng cho đầu ra khác nhau khi nếu tiến trình cha của shell là trình giả lập thiết bị đầu cuối, bởi vì trình giả lập thiết bị đầu cuối không có thiết bị đầu cuối giả lập như một thiết bị đầu cuối điều khiển. Nếu bạn thấy khác, xin vui lòng gửi đầu ra của ps -p $$ -p $PPID(một lần nữa, tôi không có kinh nghiệm về OSX, vì vậy có thể có điều gì đó bất thường đang xảy ra trên OSX).
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: đó thực sự là một cái gì đó bất thường với OSX. Tôi đã thử nghiệm trên Gentoo và mọi thứ đều đúng như bạn nói. Trên OSX, ps -p $$ -p $PPIDđưa ra (xin lỗi tôi không biết cách định dạng bình luận) PID TTY TIME CMD 209 ttys000 0: 00.01 đăng nhập -pf phunehehe 210 ttys000 0: 00.12 -bash
phunehehe

1

Không thanh lịch lắm, nhưng bạn có thể sử dụng chế độ xem dạng cây trong htop để xem mối quan hệ cha-con của vỏ của bạn với các bộ xử lý đang chạy khác.

$ htop # then press 't' and scroll around or 'Ctrl-W' to find your shell proccess

Và sử dụng điều đó để suy ra số lượng đạn pháo bạn sẽ cần phải thoát ra, trước khi tiến tới lớp vỏ "gốc"


1

Bạn có thể sử dụng biến môi trường SHLVL :

echo "$SHLVL"

1
Nếu bạn sử dụng sshví dụ cho cùng một tài khoản thì điều này vẫn sẽ là1
Anthon

0

Tôi thấy rằng

$ pstree -u | grep ${USER}

có thể khá hữu ích để xem nơi tôi "phù hợp" trên hệ thống. Tôi thích nó hơn pstree -u ${USER}.

Thỉnh thoảng nó sẽ nhắc nhở tôi rằng tôi đã bỏ một nohupcông việc đang chạy, hoặc tương tự.

(Ngoài ra, tôi sử dụng alias grep='grep --color=auto'.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.