내가 가진 껍질의“수준”을 아는 방법?


32

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

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

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

답변:


6

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

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

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


Aaah .. snap .. 나를 이길. :) +1
Stefan

현재 나는 맥에 있고 명령이 나에게 ps: illegal option -- -어떤 이유를 주었다 . 나는 리눅스에서 곧 다시 테스트 할 것이다 :)
phunehehe

3
@phunehehe : --option-name대부분 GNU 전용 기능이므로 Linux 외부의 표준 시스템 유틸리티에서는 사용할 수 없습니다. 그러나 열 이름 뒤에 ps --no-headers추가하면 이식 효과를 얻을 수 있습니다 =. 또한 comm열은 POSIX가 아니지만 cmd열 (명령의 인수를 포함)입니다. 또한 -pPOSIX 구문의 PID 전에 필요하다. 따라서 ps -o cmd= -p $PPID휴대가 가능하며 유사한 정보를 제공합니다.
Gilles 'SO- 악마 그만

확인, 젠투에서 작동
phunehehe

2
@ phunehehe : 죄송합니다, 위의 의견에서 실수를했습니다. 실제로 comm열은 POSIX에 의해 지정되고 Mac OS X에 문서화되어 cmd있지만 열은 Linux에는 있지만 표준은 아닙니다.
Gilles 'SO- 악마 그만해

37

당신은 실제로 올바른 용어 ¹에 도달했습니다. 환경 변수가 있습니다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.


약관을 확인해 주셔서 감사합니다. 나는 여전히 맥에 있고 셸 레벨에 관계없이 두 명령이 동일한 결과를 얻는다는 사실에 놀랐습니다.
phunehehe

@ phunehehe : 두 가지 명령? 의미하는 경우 ps -o tty= -p$pid프로세스의 제어 터미널을 표시하며 프로세스가 실행중인 터미널 에뮬레이터 (xterm, screen, sshd,…)를 식별합니다. 다른 쉘에서 쉘을 시작하면 변경되지 않지만 다른 쉘에서 쉘을 시작하면 변경됩니다. 새로운 터미널 에뮬레이터를 시작하십시오. 터미널 에뮬레이터가 기본 Mac 응용 프로그램 인 경우, 내가 모르는 Mac 관련 미묘한 부분이있을 수 있습니다.
Gilles 'SO- 악마 그만

ps -o tty= -p$$ 그리고 ps -o tty= -p$PPID 다른 출력을 생성해야한다고 말했기 때문입니다. 아니면 내가 잘못 이해 했습니까?
phunehehe

@ phunehehe : 터미널 에뮬레이터에 제어 터미널로 에뮬레이트 된 터미널이 없기 때문에 쉘의 부모 프로세스가 터미널 에뮬레이터 인 경우 다른 출력을 제공합니다. 다른 방법을 찾으면 출력을 게시하십시오 ps -p $$ -p $PPID(다시 OSX 경험이 없으므로 OSX에서 비정상적인 일이 발생했을 수 있습니다).
Gilles 'SO- 악마 중지

@Gilles : OSX에서는 그다지 특이한 것이 아니 었습니다. 나는 Gentoo를 테스트했고 당신이 말한대로 모든 것이 정확했습니다. OSX에서 ps -p $$ -p $PPID(미안하지만 형식을 지정하는 방법을 모르겠습니다) PID TTY TIME CMD 209 ttys000 0 : 00.01 login -pf phunehehe 210 ttys000 0 :
00.12

1

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

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

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


1

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

echo "$SHLVL"

1
ssh예를 들어 같은 계정으로 사용 하면 여전히1
Anthon

0

나는 그것을 발견

$ pstree -u | grep ${USER}

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.