[bash] 현재 작업중 인 쉘을 확인하는 방법

현재 작업중인 쉘을 어떻게 확인할 수 있습니까?

ps명령 의 출력 만으로도 충분합니까?

유닉스의 다른 풍미에서 어떻게 이것을 할 수 있습니까?



답변

  • 현재 쉘의 실행 파일 이름 을 찾는 방법에는 세 가지가 있습니다 .

    쉘의 실행 파일이 인 경우 세 가지 접근 방식을 모두 속일 수 /bin/sh있지만 실제로는 이름이 바뀝니다 bash(예 : 자주 발생).

    따라서 ps출력이 수행 될지 여부에 대한 두 번째 질문은 ” 항상 “이 아닙니다 .

    1. echo $0 -쉘의 경우 실제 쉘인 프로그램 이름을 인쇄합니다.

    2. ps -ef | grep $$ | grep -v grep-실행중인 프로세스 목록에서 현재 프로세스 ID를 찾습니다. 현재 프로세스는 쉘이므로 포함됩니다.

      목록에 쉘의 프로세스 ID와 동일한 번호를 포함하는 다른 프로세스 가있을 수 있으므로 ps, 특히 해당 ID가 작은 경우 (예 : 쉘의 PID가 “5”인 경우) 동일한 grep출력 에서 “java5″또는 “perl5” !). 이것은 쉘 이름에 의존 할 수 없다는 점에서 “ps”접근 방식의 두 번째 문제입니다.

    3. echo $SHELL-현재 쉘의 경로는 쉘의 SHELL변수 로 저장됩니다 . 이것에 대한주의 사항은 쉘을 서브 프로세스로 명시 적으로 시작하면 (예를 들어, 로그인 쉘이 아닌 경우) 로그인 쉘의 값을 대신 얻는다는 것입니다. 그럴 가능성이 있으면 ps또는 $0접근법을 사용하십시오 .


  • 그러나 실행 파일이 실제 쉘과 일치하지 않으면 (예 : /bin/sh실제로 bash 또는 ksh) 휴리스틱이 필요합니다. 다양한 쉘에 특정한 환경 변수는 다음과 같습니다.

    • $version tcsh에 설정되어 있습니다

    • $BASH bash에 설정되어 있습니다.

    • $shell (소문자)는 csh 또는 tcsh에서 실제 쉘 이름으로 설정됩니다.

    • $ZSH_NAME zsh에 설정되어 있습니다

    • KSH가 보유 $PS3하고 $PS4설정된 정상 반면 본 셸 ( sh)만을 보유 $PS1하고 $PS2세트. 이것은 일반적으로 보인다 가장 어려운 구별하기 – 단지 사이에 환경 변수의 전체 세트의 차이 shksh우리는 솔라리스 회양목에 설치 한이다 $ERRNO, $FCEDIT, $LINENO, $PPID, $PS3, $PS4, $RANDOM, $SECONDS,와 $TMOUT.


답변

ps -p $$

POSIX 옵션을 지원하는 유닉스 변형 ps -ef과 관련된 솔루션과 다른 솔루션에서 작동해야 grep하며 다른 곳에 나타날 수있는 일련의 자릿수를 grepping하여 오 탐지로 인해 발생하지 않습니다.ps


답변

시험

ps -p $$ -oargs=

또는

ps -p $$ -ocomm=


답변

사용자가 Bash를 사용하여 스크립트를 호출하고 있는지 확인하려면 다음을 수행하십시오.

if [ ! -n "$BASH" ] ;then echo Please run this script $0 with bash; exit 1; fi


답변

당신은 시도 할 수 있습니다:

ps | grep `echo $$` | awk '{ print $4 }'

또는:

echo $SHELL


답변

$SHELL항상 현재 쉘을 보여줄 필요는 없습니다. 호출되는 기본 쉘만 반영합니다.

위를 테스트하려면 bash기본 쉘 이라고 말하고 echo $SHELL같은 터미널에서 다른 쉘 ( 예 : KornShell (ksh))에 들어가서 시도하십시오 $SHELL. 두 경우 모두 결과가 bash로 표시됩니다.

현재 쉘의 이름을 얻으려면을 사용하십시오 cat /proc/$$/cmdline. 에 의해 쉘 실행 파일의 경로 readlink /proc/$$/exe.


답변

ps 가 가장 신뢰할 수있는 방법입니다. SHELL 환경 변수는 설정 될 수 없으며, 설정되어 있어도 쉽게 스푸핑 될 수 있습니다.