CLI에 명령하면, Shell이 명령을 해석해서 Kernel 이 이해할 수 있는 방식으로 전달하고 Kernel은 하드웨어가 이해할 수 있는 방식으로 전달한다. 그리고 반대로 결과를 전달하여 사람에게 보여준다. Shell은 사람이 Kernel을 제어하기 어렵기 때문에 생겨났다.

Shell의 명령어 해석 과정

  1. 입력 읽기: 사용자가 터미널에 명령어를 입력하면, 쉘은 이 입력을 읽는다. 이 과정에서 줄바꿈 문자나 엔터 키 입력을 명령어의 종료 신호로 간주한다.

  2. 토큰화(Tokenizing): 쉘은 입력된 문자열을 토큰으로 분리한다. 토큰은 공백, 탭, 줄바꿈과 같은 구분자를 사용하여 분리되며, 각 토큰은 명령어, 옵션, 인자 등을 나타낼 수 있다.

  3. 구문 분석(Parsing): 분리된 토큰들을 구문 분석을 통해 명령어의 구조를 이해한다. 이 과정에서 쉘은 명령어, 옵션, 인자 간의 관계를 파악하고, 명령어의 의미를 해석한다.

  4. 명령어 확장(Expansion): 쉘은 특정 토큰에 대해 확장을 수행할 수 있다. 예를 들어, 와일드카드(*, ? 등), 변수(예: $HOME), 및 다른 특수 문자들은 이 단계에서 확장되어 실제 값이나 의미로 변환된다.

  5. 명령어 치환(Command Substitution): 명령어 치환을 통해, 하나의 명령어 출력을 다른 명령어의 입력으로 사용할 수 있다. 예를 들어, $(command) 또는 `command` 형식을 사용한다.

  6. 인용 처리(Quoting): 인용 부호(예: “”, ‘‘)를 사용하여 특수 문자의 일반 문자로서의 해석을 강제하거나, 공백과 같은 문자를 문자열의 일부로 포함시킬 수 있다.

  7. 명령어 실행: 모든 해석 과정이 끝나면, 쉘은 최종적으로 해석된 명령어를 운영 체제에 전달하여 실행한다. 이때, 내장 명령어(built-in commands)는 쉘 자체에서 처리되며, 외부 명령어는 별도의 프로세스로 실행된다.

  8. 리다이렉션 및 파이프라인 처리: 사용자가 입력한 리다이렉션(예: >, <) 및 파이프라인( ) 명령도 이 단계에서 처리된다. 이를 통해 출력을 파일로 리다이렉션하거나, 여러 명령어의 출력과 입력을 연결할 수 있다.

Shell 확인하는 방법(linux)

  • 현재 사용 주인 쉘
    $ echo $SHELL  
    
  • 사용 가능한 쉘 목록 확인
    • file: /etc/shells
  • 쉘 변경하기
    # chsh(Change Shell)  
    $ chsh -s /bin/zsh  
    

bash vs zsh

  • 둘은 상당히 유사하나 zsh은 bash가 가지고 있지 않은 기능들이 있다.
  • tab, 약어를 통한 자동 완성 등…
  • 사용자가 입력하는 명령어들의 편의성이 다른 정도이다.