Program Tip

중첩 된 셸을 실행 중인지 어떻게 알 수 있습니까?

programtip 2020. 12. 4. 20:21
반응형

중첩 된 셸을 실행 중인지 어떻게 알 수 있습니까?


* nix 셸 (보통 bash)을 사용할 때 나는 종종 작은 작업 (보통 다른 디렉터리에 있음)을 처리 할 수있는 하위 셸을 생성 한 다음 종료하여 부모 셸의 세션을 다시 시작합니다.

가끔은 중첩 된 셸을 실행 중인지 아니면 최상위 셸에서 실행 중인지 추적하지 못하며 실수로 추가 하위 셸을 생성하거나 실수로 최상위 셸을 종료합니다. .

중첩 된 셸에서 실행 중인지 확인하는 간단한 방법이 있습니까? 아니면 완전히 잘못된 방식으로 (하위 셸을 생성하여) 문제를 해결하고 있습니까?


$SHLVL변수는 쉘 중첩 수준을 추적 :

$ echo $SHLVL
1
$ bash
$ echo $SHLVL
2
$ exit
$ echo $SHLVL
1

하위 쉘을 생성하는 대신 스택에서 디렉토리를 푸시하고 팝하고 동일한 쉘에 머물 수 있습니다.

[root@localhost /old/dir]# pushd /new/dir
/new/dir /old/dir
[root@localhost /new/dir]# popd
/old/dir
[root@localhost /old/dir]#

다음은 내 프롬프트의 일부를 단순화 한 버전입니다.

PS1='$(((SHLVL>1))&&echo $SHLVL)\$ '

중첩 된 셸에 있지 않으면 추가로 아무것도 추가하지 않지만 중첩 수준에있는 경우 깊이를 표시합니다.


보세요 $0: 마이너스로 시작 -하면 로그인 쉘에있는 것입니다.


pstree -s $$ 깊이를 확인하는 데 매우 유용합니다.


환경 변수 $SHLVL는 쉘 "깊이"를 포함합니다.

echo $SHLVL

쉘 깊이는 다음을 사용하여 결정할 수도 있습니다 pstree(버전 23 이상).

pstree -s $$ | grep sh- -o | wc -l

sudo.NET을 사용할 때 값이 재설정 되거나 신뢰할 수 없게 된 첫 번째 방법보다 더 강력한 두 번째 방법을 찾았습니다 env -i.

그들 중 누구도 su.


프롬프트에서 정보를 사용할 수 있습니다.

PS1='\u@\h/${SHLVL} \w \$ '
PS1='\u@\h/$(pstree -s $$ | grep sh- -o | tail +2 | wc -l) \w \$ '

| tail +2로부터 하나의 선을 제거하기가 grep출력. " $(...)"명령 대체 내에서 파이프 라인을 사용하고 있으므로 쉘은 하위 쉘을 호출해야하므로 pstree가이를보고하고 grep은 한 sh-레벨 이상을 감지 합니다.


데비안 기반 배포판에서은 pstree패키지의 일부입니다 psmisc. 데스크톱이 아닌 배포에는 기본적으로 설치되지 않을 수 있습니다.


ptree $$ 또한 얼마나 많은 레벨이 있는지 보여줄 것입니다.


따라 @ 존 Kugelman는 말한다 , echo $SHLVL당신에게 bash 쉘의 깊이를 말해 줄 것이다.
그리고 같은 @Dennis 윌리엄슨 쇼 , 당신은을 통해 프롬프트 편집 할 수 PS1는이 값을 인쇄 얻을 변수를.

항상 쉘 깊이 값을 인쇄하는 것을 선호 하므로 여기에 내가 한 작업이 있습니다. "~ / .bashrc"파일을 편집하십시오.

gedit ~/.bashrc

끝에 다음 줄을 추가합니다.

export PS1='\$SHLVL'":$SHLVL\n$PS1"

이제 항상 프롬프트 바로 위에 현재 bash 레벨의 출력물을 볼 수 있습니다. 예 : 여기에서 다음과 같이 bash 수준 (깊이)이 2임을 알 수 있습니다 $SHLVL:2.

$ SHLVL : 2
7510- 가브리엘 ~ $

이제 bash명령을 통해 몇 가지 bash 수준으로 내려가는 프롬프트를 확인한 다음 exit. 여기에서 내 명령과 프롬프트 (응답)를 볼 수 있습니다. 레벨 2에서 시작하여 5로 내려간 다음 레벨 2로 돌아갑니다.

$SHLVL:2 
7510-gabriels ~ $ bash
$SHLVL:3 
7510-gabriels ~ $ bash
$SHLVL:4 
7510-gabriels ~ $ bash
$SHLVL:5 
7510-gabriels ~ $ exit
exit
$SHLVL:4 
7510-gabriels ~ $ exit
exit
$SHLVL:3 
7510-gabriels ~ $ exit
exit
$SHLVL:2 
7510-gabriels ~ $ 

보너스 : 항상 터미널에 현재 상태 git branch보여 주세요!

Make your prompt also show you your git branch you are working on by using the following in your "~/.bashrc" file instead:

git_show_branch() {
    __gsb_BRANCH=$(git symbolic-ref -q --short HEAD 2>/dev/null)
    if [ -n "$__gsb_BRANCH" ]; then
        echo "$__gsb_BRANCH"
    fi
}
export PS1="\e[7m\$(git_show_branch)\e[m\n\h \w $ "
export PS1='\$SHLVL'":$SHLVL $PS1"

Source: I have no idea where git_show_branch() originally comes from, but I got it from Jason McMullan on 5 Apr. 2018. I then added the $SHLVL part shown above just last week.

Sample output:

$SHLVL:2 master
7510-gabriels ~/GS/dev/temp $

And here's a screenshot showing it in all its glory. Notice the git branch name, master, highlighted in white!

enter image description here

Cross-referenced:


If you running inside sub-shell following code will yield 2:

ps | fgrep bash | wc -l

Otherwise, it will yield 1.

EDIT Ok, it's not so robust approach as was pointed out in comments :)
Another thing to try is

ps -ef | awk '{print $2, " ", $8;}' | fgrep $PPID 

will yield 'bash' if you in sub-shell.

참고URL : https://stackoverflow.com/questions/4511407/how-do-i-know-if-im-running-a-nested-shell

반응형