내가 가진 껍질의“수준”을 아는 방법? 방법이 있습니까? 나의 진정한

터미널을 열면 xterm쉘이 생깁니다. 그런 다음 사용 ssh하거나 zsh쉘의 다른 “레벨”을 갖게됩니다. 몇 번 Ctrl+D이나 exit나가야 하는지 알 수있는 방법이 있습니까? 나의 진정한 의도는 “루트”쉘을 제외한 모든 것을 종료하는 것입니다.

또한 터미널 멀티플렉서 (같은 screen)가 솔루션에 어떤 영향을 미치는지 아는 것도 좋습니다 .

추신 : 제목을 자유롭게 변경하십시오. 올바른 용어인지 모르겠습니다.



답변

완벽하지 않은 방법 중 하나는 ps --no-headers -o comm $PPID쉘 프롬프트에 결과를 추가하는 것입니다 . 이것은 쉘을 생성 한 프로세스의 이름을 알려줄 것입니다. 중첩 된 zsh 안에 있으면 “zsh”라고 표시됩니다. 최상위 zsh에 있다면 “xterm”또는 “screen”또는 쉘이 실행중인 모든 것을 읽습니다.

ssh 또는 su 세션에 있는지 여부를 알려면 프롬프트의 호스트 이름과 사용자 이름 부분을 보면됩니다.

중첩 된 화면을 실행하는 경우 (일반적인 상황은 아닙니다) 중첩 된 화면의 최상위 쉘에 있는지 또는 최상위 쉘에 있는지 알 수있는 방법이 없습니다. 최상위 화면 중첩 된 화면에있는 경우 항상 상태 표시 줄을 표시하도록 화면을 구성하여 여러 상태 표시 줄을 표시 할 수 있습니다.


답변

당신은 실제로 올바른 용어 ¹에 도달했습니다. 환경 변수가 있습니다SHLVL모든 주요 대화식 쉘 (bash, tcsh, zsh)이 시작될 때 1 씩 증가 가 있습니다. 따라서 쉘 내부에서 쉘을 시작하면 SHLVL1 씩 증가합니다.

그러나 SHLVL터미널 에뮬레이터와 같은 것을 전달 하기 때문에 귀하의 우려에 직접 대답하지는 않습니다 . 예를 들어, 일반적인 구성 $SHLVL에서 xterm의 레벨은 2입니다. 레벨 1은 X 세션을 실행하는 쉘에 해당하기 때문입니다 (~/.xinitrc 또는 ~/.xsession) 입니다.

내가하는 일은 $SHLVL내 프롬프트 에 표시 하는 것이지만, 쉘의 부모 프로세스가 다른 쉘인 경우에만 (“이름이 끝나고 sh선택적인 구두점과 숫자로 끝나는 경우 에는 쉘”) 휴리스틱을 사용합니다. 그렇게하면 다른 쉘에서 실행되는 쉘의 드문 경우에 시각적으로 분명하게 표시됩니다.

터미널 에뮬레이터에서 직접 실행되는 쉘을 감지하는 것이 좋습니다. 그래서, 이러한 부모가 공정 다른 제어 단자가 껍질 위치 : 매우 정확하게 수행 할 수 있습니다 ps -o tty= -p$$ps -o tty= -p$PPID다른 출력을 생성합니다. SHLVL이러한 셸에서 수동으로 1로 재설정 하거나 이러한 셸에서 직접 1로 설정 TERMSHLVL하고 그렇지 않으면 증분 할 수 있습니다.

¹
매뉴얼 페이지를보고 있다고 생각하지는 않지만,이를 지원하는 세 가지 쉘 중 어느 것도 문서에 “level”이라는 단어가 포함되어 있지 않습니다 SHLVL.


답변

매우 우아하지는 않지만 htop 에서 트리 뷰 를 사용 하여 쉘의 다른 자식 프로세스와 부모-자식 관계를 볼 수 있습니다 .

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

그리고 이것을 사용하여 “루트”쉘에 도착하기 전에 종료해야 할 쉘의 양을 추론하십시오.


답변

환경 변수 SHLVL을 사용할 수 있습니다 .

echo "$SHLVL"

답변

나는 그것을 발견

$ pstree -u | grep ${USER}

시스템에서 내가 어디에 “맞는”지를 보는 데 도움이 될 수 있습니다. 나는 그것을 좋아한다pstree -u ${USER} .

때때로 그것은 내가 일을 그만두 nohup거나 그와 비슷한 것을 떠 났음을 상기시켜 줄 것입니다 .

(또한 사용 alias grep='grep --color=auto'합니다.)