내가 속한 쉘의 "레벨"을 어떻게 알 수 있습니까?

내가 속한 쉘의 "레벨"을 어떻게 알 수 있습니까?

나와 같은 터미널을 열면 xterm쉘이 생깁니다. 그런 다음 sshor를 사용하면 zsh또 다른 "레벨"의 쉘이 생깁니다. 모든 항목을 종료하기 전에 Ctrl+D몇 번이나 입력해야 하는지 알 수 있는 방법이 있습니까 ? exit나의 진짜 의도는 "루트" 쉘을 제외한 모든 것을 종료하는 것입니다.

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

추신: 제목을 자유롭게 변경해 보세요. 이것이 올바른지 모르겠습니다.

답변1

사실, 당신은 올바른 용어를 찾았습니다. SHLVL모든 주요 대화형 셸(bash, tcsh, zsh)은 시작 시 1씩 증가하는 환경 변수가 있습니다 . 따라서 쉘이 쉘 내에서 시작되면 SHLVL1씩 증가됩니다.

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

$SHLVL내가 하는 일은 프롬프트에 표시하는 것입니다. 그러나 쉘의 상위 프로세스가 다른 쉘인 경우에만 표시됩니다(" sh이름이 선택적 구두점과 숫자로 끝나면 쉘입니다"와 같은 경험적 방법 사용). 이렇게 하면 한 셸이 다른 셸 아래에서 실행되는 드문 경우에 명확한 시각적 표시를 얻을 수 있습니다.

어쩌면 터미널 에뮬레이터에서 직접 실행되는 셸을 감지하고 싶을 수도 있습니다. 이 작업을 매우 정확하게 수행할 수 있습니다. 이러한 쉘의 상위 프로세스에는 서로 다른 제어 터미널이 있으므로 서로 다른 출력을 ps -o tty= -p$$생성합니다 ps -o tty= -p$PPID. 이러한 셸에서 수동으로 1로 재설정 SHLVL하거나 이러한 셸에서 고유한 값을 TERMSHLVL1(그렇지 않으면 증분)로 설정할 수 있습니다.

1 매뉴얼 페이지를 보면 그렇게 생각되지 않을 수도 있지만 이를 지원하는 세 가지 셸에 대한 .NET 문서에는 "level"이라는 단어가 포함되어 있지 않습니다 SHLVL.

답변2

(완벽하지는 않지만) 한 가지 방법은 결과를 ps --no-headers -o comm $PPID쉘 프롬프트에 추가하는 것입니다. 이는 쉘을 생성한 프로세스의 이름을 알려줍니다. 중첩된 zsh에 있는 경우 "zsh"라고 표시됩니다. 최상위 수준 zsh에 있는 경우 "xterm" 또는 "screen" 또는 쉘이 실행 중인 모든 항목이 표시됩니다.

현재 ssh 세션에 있는지 su 세션에 있는지 확인하려면 프롬프트의 호스트 이름과 사용자 이름 부분을 살펴보세요.

중첩된 화면을 실행할 때(일반적인 경우는 아닌 것 같습니다) 중첩된 화면의 최상위 쉘에 있는지, 아니면 최상위 화면의 최상위 쉘에 있는지 알 수 없습니다. . 항상 상태 줄을 표시하도록 화면을 구성할 수 있습니다. 이렇게 하면 중첩된 화면에 있는 경우 여러 상태 줄이 표시됩니다.

답변3

매우 우아하지는 않지만 사용할 수 있습니다트리 뷰존재하다맨 위셸과 기타 실행 중인 프로세스 간의 상위-하위 관계를 봅니다.

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

이를 사용하여 "루트" 쉘에 도달하기 전에 종료해야 하는 쉘 수를 추론합니다.

답변4

내가 찾은

$ pstree -u | grep ${USER}

시스템에서 내가 "적합"한 위치를 이해하는 데 매우 도움이 됩니다. 나는 그것을 선호한다 pstree -u ${USER}.

nohup가끔은 제가 직장을 그만뒀거나 그런 일이 생각나기도 합니다 .

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

관련 정보