터미널에서 어떤 쉘을 사용하고 있는지 확인하는 방법은 무엇입니까? MacOS에서 사용중인 쉘은 무엇입니까?
echo #SHELL
그렇지 않습니다. 답변 by geekosaur 의 # 3을 참조하십시오 .
xterm -e /bin/cat
있지만 /bin/cat
쉘을 호출 하는 것은 좋지 않습니다 .
터미널에서 어떤 쉘을 사용하고 있는지 확인하는 방법은 무엇입니까? MacOS에서 사용중인 쉘은 무엇입니까?
echo #SHELL
그렇지 않습니다. 답변 by geekosaur 의 # 3을 참조하십시오 .
xterm -e /bin/cat
있지만 /bin/cat
쉘을 호출 하는 것은 좋지 않습니다 .
답변:
가장 신뢰할 수있는 것부터 가장 신뢰할 수없는 것까지 (그리고 가장 적은 것의 "무거운") 몇 가지 방법 :
ps -p$$ -ocmd=
. (Solaris에서는이 fname
대신 cmd
이어야합니다. OSX 및 BSD에서는 command
대신 이어야합니다 cmd
.)$BASH_VERSION
, $ZSH_VERSION
및 기타 쉘 특정 변수.$SHELL
; 기본 쉘을 지정 하고 반드시 현재 쉘일 필요는 없으므로 최후의 수단 입니다.$0
?
$0
그것이 더 복잡하기 때문에 좋아하지 않습니다 .
ps -p$$ -ocmd=""
는 더 예쁘다 :-)
$0
여전히 더 유용한 것 $SHELL
같습니다 : 동의하지 않습니까? sed
'-'를 제거하기 위해 항상 파이프를 통해 연결할 수 있습니다.
tcsh
, $tcsh
그리고 $version
설정됩니다. 이들은 환경 변수가 아닌 쉘 변수입니다. tcsh가 아닌 버전을 실행하는 csh
경우 고유 한 변수가 없다고 생각합니다. 물론 변수를 확인하는 데 사용되는 구문은 csh / tcsh와 다른 한편으로는 sh / ksh / bash / zsh간에 다릅니다.
더 가벼운 구현 (Android 전화, busybox 등)에 대한 참고 사항은 스위치 ps
를 항상 지원 -p
하지는 않지만 다음과 같은 명령으로 검색을 수행 할 수 있습니다 ps | grep "^$$ "
. (이 grep
정규식은 PID를 고유하게 식별하므로 오 탐지가 없습니다.
ps | grep $$
예를 들어 현재 프로세스가 1234
있고 프로세스가있는 경우 여전히 잘못된 긍정을 줄 수 있습니다 12345
.
두 가지 간단한 방법이 있습니다.
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
.
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.
환경 변수에 저장 한 경우 다음을 사용할 수 있습니다.
echo $SHELL
실행중인 쉘의 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
쉘 유형 에서는 작동하지 않습니다 .
/usr/lib/dyld
, 하나를 /private/var/db/dyld/dyld_shared_cache_x86_64
.
나는 $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