Computer Science/Linux

[Linux 관련 개념] Shell (Command interpreter)

2021. 5. 17. 18:57

Shell의 역할

  먼저 Shell의 역할을 정리하기 위해 다음의 그림을 참고할 수 있다.

 

Shell의 역할

  먼저 Teminal이란 operating system (OS, 하드웨어 및 소프트웨어를 관리하는 관리자 프로그램)에 text-based access를 제공하는 프로그램이다 (참조). 사용자가 terminal에서 commands를 입력하면, shell이 이를 해석하여 kernel로 이 정보를 전달한다. 즉, Shell은 명령어를 해석하는 프로그램이라고 생각하면 된다. Kernel은 해석된 정보를 바탕으로 하드웨어를 통해 명령을 수행하고 수행된 결과를 다시 사용자 방향으로 전송한다 (OS의 핵심적 역할 수행). Shell은 이를 해석하여 사용자에게 보여준다 (참조).

 

Shell의 종류

  Shell은 한 종류의 shell만 존재하는 것이 아니라 sh, bash, csh, ksh 등 다양한 종류가 존재한다. 이 중 sh는 UNIX에서 사용된 최초의 shell이며, bash는 sh를 기반으로 만들어진 표준 shell이다 (참조).

  아래 명령어를 통해 사용 가능한 shell 종류 및 현재 사용하는 shell 무엇인지 있다.

$ cat /etc/shells
/bin/sh
/bin/bash

$ echo $SHELL
/bin/bash

  이때 각 command의 사작 부분에 있는 "$"은 shell prompt를 나타내는 것으로, 사용자의 입력을 받을 준비가 되었다는 표시이다.

 

Shell script

  Terminal에 한 줄의 command을 입력하여 shell이 이를 해석하도록 할 수도 있지만, 여러 줄의 commands를 한번에 동작하게 하고 싶을 수 있다. 이처럼 한 줄 이상의 commands를 묶어서 저장한 텍스트 형식의 프로그램을 Shell script라고 한다. Shell script 파일은 Windows에서의 batch 파일과 같다 (참조).

  Shell script의 예제(test.sh)는 다음과 같다.

#!/bin/bash

echo "Hello World!"

  이때 리눅스에서는 /bin에 다양한 프로그램(ex. head, cat, ls 등)이 존재하는데, shell도 /bin에 들어있다. 즉, #!/bin/bash는 어떤 shell을 사용하여 명령어를 해석할지에 대한 표시로서, 해당 파일이 shell script임을 알려주는 역할을 한다.

  위 shell script 파일을 실행할 때는 다음과 같이 bash 명령어를 통해 실행할 수 있다. 이때 생성한 shell script가 실행 가능한 상태여야 한다. 만약 실행 가능하지 않다면 chmod로 속성을 바꿔줄 수 있다.

$ chmod u+x test.sh # OR $ chmod +x test.sh
$ bash test.sh

 

  참고로 shell 'script'라고 하는 이유가 따로 있다. 이를 알기 위해서는 compiler 방식과 interpreter 방식에 대해 이해해야한다. Complier 방식은 runtime 전에 compile을 하여 전자는 runtime 이전에 complie을 진행하여 전체 소스코드를 기계어로 바꿔주는 방식이다. 한편, interpreter 방식은 소스코드의 각 행을 하나씩 실행하는 방식이며, compiler보다 속도가 더 느리지만 platform 의존성을 가질 필요가 없다 (Cross-platform). Python은 대표적인 interpreted language이며, C와 C++은 complied language이다. Java는 먼저 compile이 이루어진 후 (".java -> .class" by javac) interprete되기 때문에 (".class -> 기계어" by Java Virtual Machine) 중간적인 성질을 나타낸다.

  이때 Script는 interpreter 방식으로 동작되는 프로그램(Compile X)을 말하며, 그 예로 Python script, Shell script가 있다.

 

Sub shells

  $( )을 통해 새로운 subshell을 만들 수 있다. 즉, 새로운 process를 만들며, subshell의 output은 stdout으로 작성된다.

# .txt로 끝나는 모든 파일을 출력
$ echo $(ls "*.txt")

# 다음과 같이 sub shells의 return 값은 variables로도 사용 가능하다.
VAR = $(grep "word" file.txt

 

Looping with for and while

  for loop은 whitespace로 분리된 요소(files, strings 등)에 대해서 loop를 돌 수 있다.

# 폴더 내 모든 tsv files을 txt로 변환 
for file in *.tsv; do
   convert $file "$(basename $file .tsv).txt"
done

 

  while loop은 whitespaces를 무시하고 line에 대해서 loop를 돈다.

grep "word" file.txt | while read line ; do
   echo $line
done

 

Git Bash

  Windows에서도 Command prompt, Windows Powershell, Git Bash, WSL 등을 통해 command interpreter을 사용할 수 있다. 하지만 개인적으로 Git Bash가 가장 편리한 것 같다. Git bash에서는 bash 및 Linux의 core utilities (ls, cat, head 등)을 사용할 수 있으며, 원하는 위치에서 오른쪽 클릭을 통해 바로 실행시킬 수 있다.

폴더에서 오른쪽 클릭 후 생성된 창

 

Reference

 

 

 

 

728x90
반응형