shell과 함께 보면 좋은 개념 Kernel(커널)
-Kernel(커널)이라는 것은 알맹이, 핵심, 코어. 뭐 이런뜻이 있고
-Shell(셸)이라고 하는 것은 껍데기, 주변이라는 뜻이 있다
- 하드웨어라고 하는 것이 여러분의 컴퓨터의 기계적인 부분들, 메모리라든지, 하드디스크라든지, SSD라든지, CPU 이런것들이 하드웨어이며 컴퓨터를 쓴다는 건 결국 그런 기계들을 동작시켜서 어떠한 원하는 결과를 얻어내는 일이다.
- 하드웨어를 감싸고 있는 Kernel(커널)이라고 하는 프로그램은 하드웨어 즉, 물리적인 기계를 직접적으로 제어하는 그 운영체제에서 가장 중심이 되는 그 코어이다.
- 그 Kernel(커널) 바깥쪽에 있는 Shell(셸)은 Kernel(커널)을 감싸고 있는데 Shell은 사용자로 리눅스에서 우리가 입력한 명령이 Shell(셸)을 대상으로 해서 명령을 입력해 준다.
- 이후 Shell(셸)은 입력한 그 명령을 해석해서 Kernel(커널)이 이해 할 수 있는 방식으로Kernel(커널)에게 전달해준다.
- 그러면 Kernel(커널)이라고 하는 프로그램은 하드웨어를 제어해서 어떠한 처리를 수행할수 있도록 명령한다.
- 하드웨어가 동작하여 그 처리결과를 Kernel(커널)에게 알려주면 Kernel(커널)이 다시 Shell(셸)에게 알려주는걸 통해서 우리가 입력하여 실행된 결과를 확인해볼수가 있다/
- 즉, Shell(셸)이라고 하는것은 Kernel(커널)을 우리가 직접 제어하는 것은 어려운 일이라 할 수 없기에 사람이 이해하기 쉬운 형태의 명령어를 우리가 입력하면 그 명령어를 Shell(셸)에 해당되는 프로그램들이 해석해서 Kernel(커널)에게 전달해 준다.
- 이 Shell(셸)이라고 하는것은 사용자가 입력한 명령을 해석하는 프로그램이다. 이 프로그램과 Kernel(커널)을 분리하면 여러가지의 Shell(셸)이 생겨 사용자 입장에서는 사용자가 선호하고 편하게 느껴지는 Shell(셸) 프로그램을 선택해서 사용을 할 수 있기에 편리하고 취향에 맞게 Kernel(커널)을 제어할수 있게된다.
echo 라고 하는거는 기능은 뒤에 들어온 문자를 화면에 출력하는 명령어이다.
- echo $0 을 하면 bash가 뜨는데 이는 shell 이라는 카테고리에 속하는 구체적인 제품 중에 하나인 bash라고 하는 프로그램을 쓰고 있음을 의미한다.
- zsh, zshell을 설치한 뒤 echo $0 을 했을 때 zsh가 나오면 zshell 이라고 하는
shell 이 동작하고 있는 상태 입력하는 명령들은 zshell을 통해서 커널로 전달되고 있고
커널에서 만들어진 결과는 zshell을 통해서 우리의 화면에 표시된다.
- bash와 zshell은 모가 같기 때문에 당히 유사한 특성을 갖고 있다.
- 하지만 이제 zshell의 경우에는 bash가 갖고 있지 않은 더 추가적인 기능들을 가지고 있기 때문에 좀 더 편리하다.
- 즉, 사용자가 입력하는 명령어들의 편의성이 각각의 shell 마다 다르다.
사용자가 선호하는 shell을 깔아서 사용하면 사용자에게 맞는 환경을 구성할 수 있다.
- 운영체제 안에는 kernel이 있고 shell이 있어서 사용자는 standard input 즉, 키보드를 통해서 입력을 하게 되면 입력을을 shell이 받아서 kernel을 통해서 여러 가지 작업을 처리하고 그 결과를 shell이 받은 다음에 standard output으로 출력하거나 또는 standard error 로 출력하는 걸 통해서 사용자와 상호작용하는 그런 소프트웨어를 우리가 shell 이라고 부른다.
- 하고자 하는 어떤 일에 필요한 명령이 하나일 수 있지만 많은 경우에 하나의 명령으로 여러분의 업무가 끝나는 것이 아니라 여러 개의 명령을 순차적으로 실행하는 걸 통해서 업무가 이루어지는 경우가 많다.
- 따라서 이런 경우에 순차적으로 실행돼야 되는 그 명령의 순서, 그 명령의 각본, 즉 그 명령의 스크립트를 어딘가에다가 적어놓고 나중에 재사용할 수 있면 효율적이다.
- 이 셸에서 실행되는 명령들을 어딘가에 적어두는 그런 방법과 그렇게 적어 놓은 것을
그대로 컴퓨터가 실행하게 하는 방법에 대해서 알아야한다.
-/bin/bash 라고 이렇게 적으면 이 백업이라고 하는 프로그램을 실행 시켰을 때 운영 체제는 이 첫 번째 줄에 있는 #! 기호를 보고 그 뒤에 적혀 있는 /bin/bash를 보고 bin 밑에 있는 bash 라고 하는 프로그램을 통해서 해석되어야 한다 라는 사실을 알 수 있다.
-만약 현재 디렉터리에 bak 라는 디렉터리가 없다면 만들고 있다면 만들지 않고 이후
현재 디렉터리에 있는 모든 파일 중에 .log 로 끝나는 파일을 bak 라는 디렉터리로 복사한다
-앞에다가 -d 를 붙이면 디렉터리가 존재하는지를 체크한다. 이 문법의 의미는 만약 현재 디렉토리에 bak라는 디렉토리가 없다면 bak디렉토리를 만들고 이 조건문이 끝났음을 의미하는 fi 뒤에 현재 디렉터리에 bak 디렉터리가 있으면 .log가 들어가는 모든 파일을 bak디렉토리 안에 카피하라는 뜻이다.
-이후 저장을 위해서 컨트롤 알파벳 X 를 누르고 엔터를하면 파일이 생성되고 백업이라는 파일을 실행시키기 위해 ./backup를 치면 Permission denied가 나오는데 이 프로그램, 이 파일이 실행 가능한 프로그램 임을 리눅스에게 알려줘야 한다. chmod +x backup이 의미는 backup 파일에 x, 실행 가능한 모드를 추가하여 바꾼것이다.
-rm -rf 해서 bak 라는 디렉터리를 없앤 뒤 ./backup를 실행하고 ls -l을 하면 bak 라는 디렉터리가 생성이 되고 bak 라는 디렉터리 안에는 이렇게 세 개 확장자가 log 인 파일이 저장되어 있다.
정리
-셸 스크립트는 셸에서 실행되는 스크립트 어떤 셸 명령어들이 실행되어야 될 순서를, 실행되어야 될 방법을 각본을 짜서 저장해 놓은 이 파일 셸 스크립트라 한다.
- 스크립트에서 첫 번째 줄, #!/bin/bash는 이 밑에 있는 밑에 있는 코드들이 이 bash 라고 하는 언어의 문법에 따라 만들어졌기 때문에 bash 를 실행하는 그 명령어 해석기에 해당되는 프로그램이 실행할 수 있도록 하는 약속 코드이다.
- 그래서 만약에 bak 라는 파일이 없다면(!) bak 디렉토리를 만들고 있다면 이 부분이 실행이 안 된다.
- 그 다음에 현재 디렉터리에 있는 모든 로그 파일을 bak 라는 디렉터리 밑으로 넣으라는 명령을 미한다.
- 우리는 이 파일이 실행 가능하도록 하기 위해서 chmod +x 실행 기능을 추가한다.
- 실행할 때는 현재 디렉터리에 있는 프로그램이라면 ./백업 이라고 붙여주면 된다.
ㅋ