본문 바로가기
카테고리 없음

현재 실행중인 쉘(Shell) 정보를 알 수 있는 방법

by 왕 달팽이 2019. 1. 26.
반응형

유닉스 환경에서 개발을 하다보면 정말 다양한 쉘(Shell)을 만나게 된다. 가장 친숙하게 사용되는 Bash(Bourne-again shell) 부터 zsh, csh, ksh 등등 다양한 목적으로 개발된 쉘들이 제공된다. 각 쉘마다 명령이 약간씩 다르기도하고, 출력 포맷도 약간씩 다를 때가 있다. 따라서 지금 내가 어떤 쉘을 사용하고 있는지 파악하는게 중요할 때가 있다.


친숙한 우리의 터미널



사용가능한 쉘 확인

현재 시스템에서 사용가능한 쉘 목록을 보기 위해서는  /etc/shells 파일을 확인하면 된다. 


$ cat /etc/shells

# List of acceptables shells for chpass(1)

# Ftpd will not allow users to connect who are not using

# one of these shells.


/bin/bash

/bin/csh

/bin/ksh

/bin/sh

/bin/tcsh

/bin/zsh


현재 내 맥북에서 /etc/shells 파일을 조회해본 결과다. 리눅스는 출력 포맷이 약간 다를 수 있지만 결국 출력되는 의미는 동일하다. 


현재 사용중인 쉘 확인

사용자가 시스템에 로그인을 하고 터미널을 열면 로그인 쉘이 구동된다. 로그인 쉘은 사용자별 특성으로 설정가능하며, 쉘에서 또 다른 쉘을 실행 시킬 수도 있다. 현재 사용중인 쉘을 확인하는 방법을 알아보자. 


우선 다음 명령을 사용해 확인해 볼 수 있다. 


$ echo $0

-bash


혹은 $SHELL 환경변수를 조회해보면 사용자의 로그인 쉘을 확인할 수 있다. 


$ echo $SHELL

/bin/bash


이 두 가지 방법은 스크립트 안쪽에서 생각대로 동작하지 않을 수 있다. 


현재 사용자의 로그인 쉘이 /bin/bash 이고, 다음 쉘 스크립트를 실행한다고 하자. 스크립트의 이름은 test.sh 이다. 


#!/bin/zsh


echo "\$0 : $0"

echo "\$SHELL : $SHELL"


이 스크립트를 실행하면 다음 결과를 얻게 된다. 


$ ./test.sh

$0 : ./test.sh

$SHELL :/bin.bash


터미널을 연 직후 echo $0 명령을 실행해보면 로그인 쉘의 이름이 등장했다. 하지만 스크립트 파일에서 $0 을 조회하면 스크립트 파일 이름이 출력된다. /bin/zsh 이라는 출력을 생각하고 스크립트를 작성했다면 잘못된 동작을 할 것이다. 마찬가지로 $SHELL 환경변수를 출력해보면 /bin/bash가 출력된다. 이 유저는 로그인할 때 /bin/bash 를 사용하도록 설정되었기 때문이다. 따라서 test.sh  파일을 /bin/zsh을 이용해 실행하더라도 $SHELL 환경변수는 바뀌지 않아 그대로 bash를 가리키게 되는 것이다. 


좀 더 고급 사용법은 "$$"을 이용한 방법이다. test.sh 을 다음과 같이 바꿔 보겠다. 


#!/bin/zsh


ps -p "$$"


$$ 는 현재 쉘 스크립트의 PID(Process ID)를 의미한다. 이 PID를 이용해서 ps 명령을 실행시켜보면 현재 쉘 스크립트의 실행정보를 알아낼 수 있다. 이 스크립트를 실행해보면,


$ ./test.sh


     PID   TTY                    TIME   CMD

  6093   ttys002        0:00.01    /bin/zsh ./test.sh


이런 정보를 얻을 수 있다. ps의 결과중 CMD 쪽을 확인해보면, /bin/zsh을 구동시키고 ./test.sh을 인자로줘서 실행시켰다는 정보를 알 수 있다. ps -p $$ 대신 ps -cp $$ 를 실행하면, 


$ ./test.sh


     PID   TTY                    TIME   CMD

  6093   ttys002        0:00.01    zsh


CMD 부분에 쉘 프로그램의 이름만 나오게 된다. 이 결과를 적절하게 잘 사용하면 된다.


반응형

댓글