현재 작업중인 쉘을 어떻게 확인할 수 있습니까?
ps
명령 의 출력 만으로도 충분합니까?
유닉스의 다른 풍미에서 어떻게 이것을 할 수 있습니까?
답변
-
현재 쉘의 실행 파일 이름 을 찾는 방법에는 세 가지가 있습니다 .
쉘의 실행 파일이 인 경우 세 가지 접근 방식을 모두 속일 수
/bin/sh
있지만 실제로는 이름이 바뀝니다bash
(예 : 자주 발생).따라서
ps
출력이 수행 될지 여부에 대한 두 번째 질문은 ” 항상 “이 아닙니다 .-
echo $0
-쉘의 경우 실제 쉘인 프로그램 이름을 인쇄합니다. -
ps -ef | grep $$ | grep -v grep
-실행중인 프로세스 목록에서 현재 프로세스 ID를 찾습니다. 현재 프로세스는 쉘이므로 포함됩니다.목록에 쉘의 프로세스 ID와 동일한 번호를 포함하는 다른 프로세스 가있을 수 있으므로
ps
, 특히 해당 ID가 작은 경우 (예 : 쉘의 PID가 “5”인 경우) 동일한grep
출력 에서 “java5″또는 “perl5” !). 이것은 쉘 이름에 의존 할 수 없다는 점에서 “ps”접근 방식의 두 번째 문제입니다. -
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
세트. 이것은 일반적으로 보인다 가장 어려운 구별하기 – 단지 사이에 환경 변수의 전체 세트의 차이sh
와ksh
우리는 솔라리스 회양목에 설치 한이다$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
.