터미널에서 어떤 쉘을 사용하고 있는지 테스트하는 방법은 무엇입니까?


69

터미널에서 어떤 쉘을 사용하고 있는지 확인하는 방법은 무엇입니까? MacOS에서 사용중인 쉘은 무엇입니까?


2
@xenoterracide : 최소한 unix.stackexchange.com/questions/3645/… . geekosaur의 답변이 더 완전하므로 이전 질문을 끝내기로 투표했습니다.
Gilles

1
메아리 $ SHELL?
무고한 세계

@ innocent-world 아니요, echo #SHELL그렇지 않습니다. 답변 by geekosaur 의 # 3을 참조하십시오 .
Basil Bourque

"쉘"에 잘 정의 된 의미가 있는지 잘 모르겠습니다. 예를 들어, 당신은 실행할 수 xterm -e /bin/cat 있지만 /bin/cat쉘을 호출 하는 것은 좋지 않습니다 .
Basile Starynkevitch

또한 scsh 같은 일부 쉘은 구문과 같은 POSIX 쉘을 사용하지 않습니다.
Basile Starynkevitch

답변:


71

가장 신뢰할 수있는 것부터 가장 신뢰할 수없는 것까지 (그리고 가장 적은 것의 "무거운") 몇 가지 방법 :

  1. ps -p$$ -ocmd=. (Solaris에서는이 fname대신 cmd이어야합니다. OSX 및 BSD에서는 command대신 이어야합니다 cmd.)
  2. 확인 $BASH_VERSION, $ZSH_VERSION및 기타 쉘 특정 변수.
  3. 확인 $SHELL; 기본 쉘을 지정 하고 반드시 현재 쉘일 필요는 없으므로 최후의 수단 입니다.

4
당신도 언급해야합니까 $0?
Mikel

나는 $0그것이 더 복잡하기 때문에 좋아하지 않습니다 .
geekosaur

ps -p$$ -ocmd=""는 더 예쁘다 :-)
asoundmove

1
@geekosaur : 아마도 그렇지만 $0여전히 더 유용한 것 $SHELL같습니다 : 동의하지 않습니까? sed'-'를 제거하기 위해 항상 파이프를 통해 연결할 수 있습니다.
iconoclast

2
경우에 당신은 실행하고 tcsh, $tcsh그리고 $version설정됩니다. 이들은 환경 변수가 아닌 쉘 변수입니다. tcsh가 아닌 버전을 실행하는 csh경우 고유 한 변수가 없다고 생각합니다. 물론 변수를 확인하는 데 사용되는 구문은 csh / tcsh와 다른 한편으로는 sh / ksh / bash / zsh간에 다릅니다.
Keith Thompson

41

내 시스템에 설치 한 4 개의 쉘 (bash, dash, zsh, csh)에서 다음이 작동 함을 발견했습니다.

$ ps -p $$

다음은 zsh, bash 및 dash에서는 작동하지만 csh에서는 작동하지 않습니다.

$ echo $0

2
물고기에서는 작동하지 않습니다.
Ron E

@jiliagre의 대답은 아마도 오늘 사용할 것입니다. %self대신 생선 대신 사용할 수 있습니다$$
Steven D

8

질문에 사용 된 쉘을 요구하고 전달 된 잠재적 인 인수에 대해 이야기하지 않기 때문에 여기에 표시하지 않는 방법이 있습니다.

$ ps -o comm= -p $$
ksh93 

6

더 가벼운 구현 (Android 전화, busybox 등)에 대한 참고 사항은 스위치 ps를 항상 지원 -p하지는 않지만 다음과 같은 명령으로 검색을 수행 할 수 있습니다 ps | grep "^$$ ". (이 grep정규식은 PID를 고유하게 식별하므로 오 탐지가 없습니다.


7
ps | grep $$예를 들어 현재 프로세스가 1234있고 프로세스가있는 경우 여전히 잘못된 긍정을 줄 수 있습니다 12345.
Keith Thompson

4

두 가지 간단한 방법이 있습니다.

  • ps 명령 사용 :

    ps -o comm= $$

    또는

    ps -h -o comm -p $$

    어디:

    • -h또는 =헤더를 표시하지 않기 위해 모든 옵션을 마무리합니다 .
    • -o comm프로세스 기본 이름 만 표시합니다 ( bash대신 /bin/bash).
    • -p <PID> PID 양식 목록을 지원하는 프로세스 만 나열하십시오.
  • 은 Using / PROC 프로세스 정보의 가상 파일 시스템 :

    cat /proc/$$/comm

    이 옵션은 ps위 의 명령 과 동일하게 작동합니다 .

    또는

    readlink /proc/$$/exe

    이것은 /proc/PID/exe실행중인 파일에 연결되며,이 경우 / bin / bash, / bin / ksh 등을 가리 킵니다.

    쉘의 이름 만 얻으려면 다음을 사용할 수 있습니다.

    basename $(readlink /proc/$$/exe)

    이 옵션은 스크립트, 소스 코드 또는 터미널에있는 경우에도 사용중인 쉘 인터프리터의 이진에 대한 링크와 같은 결과를 항상 제공하는 유일한 옵션입니다.

    경고 이것은 궁극적 인 바이너리를 보여줄 것이므로 ksh는 ksh93에 연결되거나 sh는 bash에 연결될 수 있습니다.

의 사용법은 현재 명령의 PID에 연결 /proc되는를 통해 실제로 유용합니다 /proc/self.


3

Mac (comm), Solaris (fname) 및 Linux (cmd)와 호환되는 다른 모든 답변의 혼합 :

ps -p$$ -o cmd="",comm="",fname="" 2>/dev/null | sed 's/^-//' | grep -oE '\w+' | head -n1

이것은 현재 디렉토리 이름을 알려줍니다. 또한, 아래에 csh그리고 tcsh그것은 나에게 준다Ambiguous output redirect.
iconoclast

2

환경 변수에 저장 한 경우 다음을 사용할 수 있습니다.

echo $SHELL

그것은 아마도 로그인 쉘의 쉘 실행 파일의 경로 이름을 반환합니다. 로그인 쉘이 현재 실행중인 것인지 확실하지 않습니다.
Kusalananda

1

실행중인 쉘의 pid는 var $$ (대부분의 쉘에서)로 제공됩니다.

whichsh="`ps -o pid,args| awk '$1=='"$$"'{print $2}'`"
echo "$whichsh"

백틱을 사용하여 jsh (Heirlomm shell) 작동

많은 쉘에서 직접 테스트를 ps -o args= -p $$수행하지만 busybox ash실패합니다.

대부분의 오 탐지 $1$$제거 하기 위해 동일해야하는 검사입니다 .

마지막 ;:은 ksh 및 zsh에 대해 쉘을 계속 실행하는 데 사용됩니다.

더 많은 시스템에서 테스트하면 도움이 될 것입니다. 효과가 없다면 의견을 말하십시오.

csh쉘 유형 에서는 작동하지 않습니다 .


OS / X에서 내 테스트에서, 나는 적어도 3 선, 쉘 하나, 하나 얻을 /usr/lib/dyld, 하나를 /private/var/db/dyld/dyld_shared_cache_x86_64.
Stéphane Chazelas

예, 이제 / bin 및 / usr / bin의 항목 만 선택합니다
Stéphane Chazelas

@ StéphaneChazelas 어쩌면 지금은 더 나을까요?

0

나는 $MYSHELL쉘 불가지론에서 미래의 테스트를 위해 설정 했다 ~/.aliases.

unset MYSHELL
if [ -n "$ZSH_VERSION" ] && type zstyle >/dev/null 2>&1; then        # zsh
  MYSHELL=`command -v zsh`
elif [ -x "$BASH" ] && shopt -q >/dev/null 2>&1; then                # bash
  MYSHELL=`command -v bash`
elif [ -x "$shell" ] && which setenv |grep builtin >/dev/null; then  # tcsh
  echo "DANGER: this script is likely not compatible with C shells!"
  sleep 5
  setenv MYSHELL "$shell"
fi

# verify
if [ ! -x "$MYSHELL" ]; then
  MYSHELL=`command -v "$(ps $$ |awk 'NR == 2 { print $NF }')"`
  [ -x "$MYSHELL" ] || MYSHELL="${SHELL:-/bin/sh}"  # default if verify fails
fi

tcsh섹션은 POSIX 스타일 스크립트로 롤업하는 것이 현명하지 않기 때문에 현명하지 않을 수 있습니다 (따라서 경고와 5 초의 일시 정지). (하나의 csh스타일 쉘은 유명한 Csh 프로그래밍 으로 인한 해로운 rant에 언급 된 것처럼 2>/dev/null또는을 수행 할 수 없습니다 .)>&2


-1

당신은 간단하게 사용할 수 있습니다 echo $0당신이 사용하고있는 쉘 확인하는 명령을 <name_of_the_shell> --version쉘의 버전을 확인 할 수 있습니다. (예. bash --version).


Steven D는 이미 그것을 언급했다
:)

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