it-swarm-ko.tech

내가있는 포탄의 "레벨"을 어떻게 알 수 있습니까?

xterm와 같은 터미널을 열면 셸이 생깁니다. 그런 다음 ssh 또는 zsh를 사용하면 다른 "레벨"의 Shell을 갖게됩니다. 몇 번을해야하는지 알 수있는 방법이 있나요 Ctrl+D 또는 exit을 입력하여 모두 종료 하시겠습니까? 내 진짜 의도는 "루트"셸을 제외한 모든 것을 종료하는 것입니다.

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

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

32
phunehehe

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

Ssh 세션에 있는지 su 세션에 있는지 확인하려면 프롬프트의 호스트 이름과 사용자 이름 부분을 확인하면됩니다.

중첩 된 화면 (일반적인 상황이라고 생각하지 않음)을 실행할 때 중첩 된 화면의 최상위 셸에 있는지 아니면 최상위 셸에 있는지 알 수있는 방법이 없습니다. 최상위 화면의. 중첩 된 화면에있는 경우 항상 상태 표시 줄을 표시하도록 화면을 구성 할 수 있습니다. 그러면 여러 상태 표시 줄이 표시됩니다.

6
sepp2k

실제로 정확한 용어 ¹를 맞았습니다. 모든 주요 대화식 쉘 (bash, tcsh, zsh)이 시작될 때 1 씩 증가하는 환경 변수 SHLVL이 있습니다. 따라서 셸 내에서 셸을 시작하면 SHLVL가 1 씩 증가합니다.

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

내가하는 일은 내 프롬프트에 $SHLVL를 표시하는 것이지만 셸의 상위 프로세스가 다른 셸인 경우에만 (“이름이 sh로 끝나는 경우 추가로 구두점 및 숫자, 쉘입니다.”). 이렇게하면 다른 셸에서 실행되는 흔하지 않은 경우에 명백한 시각적 표시가 있습니다.

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

¹ 비록 매뉴얼 페이지를보고 있다고 생각하지 않겠지 만 그것을 지원하는 세 개의 쉘 중 어느 것도 SHLVL 문서에 "레벨"이라는 단어가 포함되어 있지 않습니다.

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

echo "$SHLVL"
1
Alex

별로 우아하지는 않지만 htop 에서 tree view 를 사용하여 다른 실행중인 프로세스에 대한 셸의 부모-자식 관계를 볼 수 있습니다. .

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

그리고 이것을 사용하여 "루트"셸에 도착하기 전에 종료해야하는 셸의 양을 추론합니다.

1
Stefan

나는 그것을 발견

$ pstree -u | grep ${USER}

시스템에서 내가 "적합"하는 위치를 확인하는 데 매우 유용 할 수 있습니다. pstree -u ${USER}보다 선호합니다.

가끔 Nohup 작업을 실행 중이거나 이와 유사한 작업을 떠났다는 사실을 상기시켜줍니다.

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

0
J_H