사랑하애오
article thumbnail
Published 2021. 12. 16. 14:32
리눅스 Shell Script 정리 Linux

쉘(shell)

쉘(shell) 명령어 해석기, 명령행 인터페이스이자 스크립트 언어이다.

유닉스 계열의 운영체제는 보통 텍스트 모드의 터미널 화면에서 명령행에 명령어를 타이핑 하여 사용한다. 이 명령어를 해석하는 프로그램 쉘(shell)이다. 즉 쉘은 명령어 해석기 또는 명령행 인터페이스를 의미한다. 쉘을 사용하는 것은 윈도우의 '명령 프롬프트'에서 명령을 실행하는 것과 유사하지만 리눅스의 쉘은 훨씬 강력한 기능을 제공한다. 쉘 명령은 GUI 도구로는 수행하기 어려운 다양한 고급 기능을 제공한다. 또한 쉘은 스크립트 언어이기도 하다. 쉘 명령어로 구성된 쉘 스크립트 프로그램을 작성하면 쉘이 스크립트 파일을 읽어 일련의 명령을 수행할 수 있다.

 

 

윈도우 명령 프롬프트 창

 

리눅스 콘솔 창

 

쉘은 운영체제의 일부이며 커널과는 분리된 프로그램이다. 쉘의 종류에 따라 alias 설정, 초기화 파일, 스크립트 작성 등에서 다른 특성을 가질 수 있다. 리눅스 사용자는 자신이 선호하는 쉘을 기본 쉘로 설정하여 사용할 수 있다.

 

쉘의 종류

리눅스 배포판 마다 여러 종류의 쉘이 제공되는데 CentOS를 비롯한 많은 리눅스 배포판에서 기본 쉘로 사용되는 것이 'bash(Bourne Again Shell) 쉘'이다. bash 쉘은 초기 유닉스 쉘인 'Bourne 쉘'과 호환되며 속도와 편의성을 개선한 GNU 무료 공개용 버전이다. 명령을 입력할 수 있는 라인 '명령 행'이라 하며 커서(_) 좌측 프롬프트 '명령 대기중'임을 표시한다. bash 쉘의 경우 기본 프롬프트 $이며 root  #이다.(이는 변경이 가능하다.)

 

명령 행 좌측에 프롬프트가 일반 사용자는 $, root는 #로 표시된다.

 

쉘 이름 실행 명령 설명
Bourne Shell sh 유닉스 초기부터 사용된 쉘로 대부분의 유닉스 계열 운영체제에서 지원한다. 많은 쉘 스크립트가 이에 기반을 두고 있다.
C Shell csh 스크립트 작성 형식이 C언어 구문과 비슷하며 BSD 계열의 유닉스 사용자들이 많이 사용했다. Bourne 쉘의 기능을 확장했다.
TC Shell tcsh C 쉘을 확장 개선한 버전으로 '명령 행 완성'과 '명령 행 편집' 기능이 추가됐다.
Korn Shell ksh 호환성을 유지하면서 Bourne 쉘을 확장하고 C 쉘의 많은 기능을 추가했다. System V 계열 유닉스 사용자들에게 인기가 많았다.
Bourne Again Shell(bash) bash 리눅스에서 가장 많이 사용되는 쉘이다. Bourne 쉘을 토대로 개발됐으며 C 쉘과 Korn 쉘의 유용한 기능을 가져왔다. GPL 라이센스를 따른다.

표 - 주요 쉘의 특징

 

이후 내용은 bash 쉘을 기준으로 한다.

 

쉘의 구분 - 로그인 쉘, 비 로그인 쉘, 서브 쉘

로그인 쉘

로그인 쉘은 로그인할 때 수행되는 기본 쉘이다. 로그인 쉘은 logout 명령으로 로그아웃하여 쉘을 종료할 수 있다.(비 로그인 쉘에서는 logout 명령을 사용할 수 없다.) 텍스트 모드에서 사용자 계정으로 로그인할 때 수행되는 쉘이 로그인 쉘이다. 또한 다른 사용자 계정으로 전환하는 su -l username 명령으로 수행되는 서브 쉘도 로그인 쉘이다. -l 옵션은 지정된 사용자의 로그인 쉘을 시작하는 옵션이다.

 

[user1@localhost ~]$ whoami
user1
[user1@localhost ~]$ su -l user2
Password:
[user2@localhost ~]$ whoami
user2
[user2@localhost ~]$ logout
[user1@localhost ~]$ 
cs

su -l user2 명령으로 사용자 user2의 로그인 쉘을 실행하며 사용자를 전환한다. logout 명령으로 user2의 로그인 쉘을 종료하고 user1의 쉘로 돌아간다.

 

비 로그인 쉘

말그대로 로그인 쉘이 아닌 쉘이다. logout 명령이 아닌 exit 명령으로 쉘을 종료한다. GUI 환경(그래픽 모드)에서 터미널을 띄우면 수행되는 쉘이 비 로그인 쉘이다. 또한 다른 사용자 계정으로 전환하는 su username 명령으로 수행되는 서브 쉘도 비 로그인 쉘이다.

 

[user1@localhost ~]$ whoami
user1
[user1@localhost ~]$ su user2
Password:
[user2@localhost ~]$ whoami
user2
[user2@localhost ~]$ logout
[user2@localhost ~]$ bash: logout: not login shell: use 'exit'
[user2@localhost ~]$ exit
[user1@localhost ~]$ 
cs

su user2 명령으로 사용자 user2로 단순 전환한다. 로그인 쉘을 실행하지 않으므로 관련된 초기화 스크립트가 실행되지 않고 단지 사용자만 전환된다. 로그인 쉘이 아니므로 logout으로 쉘을 종료할 수 없고 exit 명령으로 쉘을 종료한다.

 

서브 쉘

현재 쉘 안에서 실행되는 쉘이다. 현재 쉘의 자식 프로세스로 실행된다. exit 명령으로 서브 쉘을 종료하고 부모 쉘로 돌아간다. 서브 쉘은 부모 쉘의 환경 변수를 전달받아 공통적으로 사용할 수 있다. 예를 들어 현재 쉘에서 sh 명령으로 bourne 쉘을 실행할 수 있는데, 이렇게 실행된 쉘을 서브 쉘이라고 한다.

 

[user1@localhost ~]$ export FOO=bar
[user1@localhost ~]$ sh
sh-4.1$ echo $FOO
bar
sh-4.1$ exit
exit
[user1@localhost ~]$ unset FOO
[user1@localhost ~]$ echo $FOO
 
[user1@localhost ~]$ 
cs

위와 같이 부모 쉘에서 만든 환경 변수 FOO가 서브 쉘에서도 사용할 수 있음을 확인할 수 있다.

 

※ [참고] 각 명령어의 의미

export FOO=bar : 문자열 bar를 갖는 환경 변수 FOO 만듦

sh : bourne 쉘을 서브 쉘로 실행

echo $FOO : 변수 FOO 값 출력

exit : 서브 쉘 종료

unset FOO : 변수 삭제

 

리눅스 기본(로그인) 쉘 확인

grep username /etc/password
cs

 

[user1@localhost ~]$ grep user1 /etc/passwd
user1:x:502:502:General User:/home/user1/bin/bash
cs

grep을 이용한 리눅스 기본 쉘 확인 방법

 

grep 계정명 /etc/passwd를 통해 해당 사용자의 기본 쉘을 확인할 수 있다. 결과의 마지막 항목인 /bin/bash가 user1 사용자의 기본 쉘이 bash임을 의미한다.

 

리눅스 기본(로그인) 쉘 변경 - chsh

chsh -/bin/tcsh        # 현재 사용자의 기본 쉘을 tcsh로 변경
chsh -/bin/tcsh user1  # user1의 기본 쉘을 tcsh로 변경
chsh -l                 # 사용 가능한 쉘 출력
cs

대상 username이 생략되면 현재 로그인한 사용자를 대상으로 한다. 다른 사용자의 쉘을 바꾸려면 권한이 있어야 한다.

 

[user1@localhost ~]$ chsh -l
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
cs

사용 가능한 쉘 확인

 

옵션 내용
-l 사용 가능한 쉘을 나열(/etc/shells 파일 내용과 동일)
-s shell 로그인 쉘 변경
ex: chsh -s /bin/tcsh
-u 도움말(usage)

표 - chsh 명령어 옵션

Extended Shell Scripts

쉘 스크립트를 수행할 작업과 시기를 알려주는 필수 구성요소가 필요하다. 대부분의 쉘 스크립트는 이보다 복잡하지만, 쉴 스크립트 역시 일종의 프로그래밍 언어이며, 변수, 함수, 제어, 반복 등과 같은 구조로 이루어진다. 스크립트가 복잡한 구조로 되어 있어도 순차적인 실행구조를 가진다.

다음은 간단한 입력 구조를 가지는 쉘 스크립트 예제이다.

#!/bin/sh

echo "What is your name?"
read PERSON
echo "Hello, $PERSON"
$./test.sh
What is your name?
lucas
Hello, lucas

Using Shell Variables

쉘에서 변수를 사용하는 방법에 대해 알아본다. 위키피디아의 정의에 따르면 변수는 "아직 알려지지 않거나 어느 정도까지만 알려져 있는 양이나 정보에 대한 상징적인 이름이다. 컴퓨터 소스 코드에서의 변수 이름은 일반적으로 데이터 저장 위치와 그 안의 내용물과 관련되어 있으며 이러한 것들은 프로그램 실행 도중에 변경될 수 있다."라고 정의되어 있다.

이를 쉽게 정의하면 다음과 같다.

  1. 변수는 컴퓨터 메모리에 존재한다.
  2. 할당된 메모리 공간은 정보를 저장하기 위해서 사용된다.
  3. 정보가 저장된 공간을 찾기위해서, 이름을 붙여서 사용한다.

변수의 할당된 값은 숫자, 텍스트 파일, 파일 이름, 장치 또는 다른 유형의 데이터일 수 있으며, 변수는 할당된 메모리의 주소를 나타내는 포인터이기 때문에 변수를 생성, 할당, 삭제가 가능하다.

Variable Names

쉘에서 변수이름을 지칭하는 규칙은 다음과 같다.

  • 변수 안에 들어갈 수 있는 글자는 a to z, A to Z이다.
  • 변수 안에 들어갈 수 있는 숫자는 0 ~ 9까지 이다.
  • 서로 다른 변수 이름을 이어서 사용하기 원한다면 underscore character ( _ )을 사용한다.
  • 쉘 변수의 이름은 대문자를 사용한다.

올바른 변수 선언의 예제를 살펴보면 다음과 같다.

_ALL
NAME
VAR_1
VAR_2

잘못된 변수 선언의 예제는 다음과 같다.

2_VAR
-VARIABLE
VAR1-VAR2
VAR_A!

쉘에서!, -, *와 같은 특수문자를 사용할 수 없는 이유는 쉘 자체에서 지칭하는 의미가 존재하기 때문이다.

Defining Variables

변수를 정의하는 일반적인 방법은 다음과 같다.

variable_name=variable_value
NAME="Lucas"

위의 예제에서 확인할 수 있듯이 NAME이라는 변수를 정의하고 "lucas"라는 값을 대입할 수 있다. 이러한 유형의 변수를 스칼라 변수라고 지칭하는데 스칼라 변수는 한 번에 하나의 값을 저장할 수 있다는 특징을 가지고 있다.

ORGANIZATIONS="wisoft"
NUMER_OF_PEOPLE=30

Accessing Values

변수에 저장된 값에 접근하기 위해서는 이름 앞에 $기호를 붙여야 한다. 다음 예제는 정의된 변수 NAME 값에 접근하고 STDOUT으로 출력한다.

#!/bin/sh

NAME="Lucas"
echo $NAME

Read-only Variables

쉘에서는 읽기 전용으로 변수를 지정할 수 있으며, 읽기 전용으로 지정된 변수는 값을 변경할 수 없다. 다음 예제는 읽기 전용 변수에서 값을 변경하고자 할 때 나타나는 에러를 보여준다.

#!/bin/sh

NAME="Lucas"
readonly NAME
NAME="Seongwon LEE"
$ /bin/sh: NAME: This variable is read only.

Unsetting Variables

변수에 할당된 값을 해제하면 더 이상 변수에 접근할 수 없다.

#!/bin/sh

NAME="Lucas"
unset NAME
echo $NAME

위의 변수를 실행하게 되면 어떠한 것도 출력되지 않으며, 읽기 전용으로 선언된 변수는 unset 할 수 없다.

Variable Types

쉘이 실행하기 위해서는 다음과 같은 3가지의 주요 변수가 존재한다.

지역변수

  • 쉘의 인스턴스에 존재하는 변수로 기본적으로 쉘에서 지정한 모든 변수는 전역 변수로 선언되기 때문에 지역변수를 사용하기 위해서는 local 키워드를 반드시 사용해야 한다.
  • 혹은 쉘을 실행할 때 인자 값으로 넘겨줄 수 있다.

환경변수

  • 쉘 스크립트를 통해 작성된 프로그램 중에서 정상적으로 동작하기 위한 변수이다.
  • 선언된 변수는 모든 자식 프로세스에서 접근하여 사용할 수 있으며, 프로그램이 실행하기 위해 참조되는 경우 외에는 사용하면 안 된다.

쉘 변수

  • 쉘이 동작하기 위해 필요한 특수 변수이다.
  • set 명령을 통해 쉘 변수를 확인할 수 있다.
  • $ set '!'=0 '#'=0 '$'=985 '*'=( ) -=569JNRXZghiklms 0=-zsh '?'=0 @=( ) ARGC=0 BG CDPATH='' COLORFGBG='7;0' COLORTERM=truecolor COLUMNS=114 COMMAND_MODE=unix2003 COMP_WORDBREAKS=: CPUTYPE=x86_64 CURRENT_BG=NONE
  • 우리가 흔히 알고 있는 쉘 변수로는 $PATH, $HOME 등이 있다.

'Linux' 카테고리의 다른 글

리눅스 비교연산, 산술연산 - test 명령  (0) 2021.12.17
리눅스 Shell Script 변수정리  (0) 2021.12.17
리눅스 wget 정리  (0) 2021.12.16
리눅스 다중명령어  (0) 2021.12.14
리눅스 프로세스 정리  (0) 2021.12.14
profile

사랑하애오

@사랑하애

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!