중첩 된 셸을 실행 중인지 어떻게 알 수 있습니까?
* 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!
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
'Program Tip' 카테고리의 다른 글
ADO.NET | DataDirectory | (0) | 2020.12.04 |
---|---|
Coq와 같은 비 튜링 완전한 언어의 실질적인 한계는 무엇입니까? (0) | 2020.12.04 |
고유 한 솔루션으로 스도쿠 보드를 생성하는 방법 (0) | 2020.12.04 |
CSS를 사용하여 콘텐츠 주위에 원을 만드는 방법은 무엇입니까? (0) | 2020.12.04 |
`sizeof`가 * 정말 *`std :: size_t`로 평가됩니까? (0) | 2020.12.04 |