리눅스와 터미널

lilyoh·2020년 7월 28일
0

개발한 프로그램이 배보되고 동작하는 환경이 Linux OS 가 설치된 서버이고,
리눅스에서 명령어를 전달하는 수단이 Terminal 이다.

1. Linux Basics

리눅스는 1991년 Linus Torvals 가 개발한 운영체제이다. 리눅스는 오픈소스이며 누구나 코드를 볼 수 있다. 리눅스는 시스템 운영에 가장 널리 사용되는 운영체제이다. 윈도우 시스템이나 어플리케이션이 아니라면 일반적으로 시스템 서버는 리눅스 기반으로 운영되고 있다.

2. Linux File System Hierarchy (FHS)

  • 리눅스의 파일 구조는 트리 형태로 되어있다.

  • FHS 의 가장 위에는 / 디렉토리가 있다. root 디렉토리라고 하며 '폴더'와 동일한 개념이다.

  • 각 디렉토리는 slash / 로 구분한다. 윈도우에서는 back slash \ 로 구분한다. 예를 들어 root 디렉토리 안에 home 이라는 하위 디렉토리가 있고 그 안에 eun 이라는 하위 디렉토리가 있고 그 안에 bin 이라는 디렉토리가 있다면 "bin 디렉토리까지의 경로" 는 다음과 같다.

/home/eun/bin
  • 터미널에서 root 디렉토리로 이동하고 싶다면 이렇게 한다.
cd /
  • 해당 디렉토리의 내용물들을 확인하고 싶다면 이렇게 한다.
  • ls 는 list 의 약자이며 해당 디렉토리의 내용물들을 나열해준다.
ls
  • root 디렉토리에서 ls 를 입력해서 하위 디렉토리들을 보면 home 디렉토리가 있다. (맥은 user 디렉토리) home 디렉토리는 유저의 공간이기 때문에 주로 home 디렉토리에서 많은 것을 하게 된다. home 디렉토리는 아주 중요하기 때문에 cd 명령어를 실행할 때 디렉토리 경로를 생략하고 cd 만 입력하면 자동으로 home 디렉토리로 이동한다.

  • tilda ~ 를 사용해서 home 디렉토리를 나타낼 수 있다. 예를 들어 cd ~ 명령어를 사용하면 home 디렉토리로 이동할 수 있다. cd ~/bin 명령어를 사용하면 home 디렉토리의 하위 디렉토리 bin 디렉토리로 이동할 수 있다.

3. Directory 경로

  • 디렉토리 경로에는 2 가지가 있다 : absolute path 와 relative path
  1. absolute path
    : 절대적 경로, 완전한 경로
    : root 디렉토리부터 시작하는 경로
    : root 디렉토리부터 시작하기 때문에 현재 나의 위치와 상관없이 항상 정확히 해당 경로로 이동할 수 있다.

  2. relative path
    : 상대적 경로
    : 현재 내 위치를 기반으로 움직이는 경로
    : ... 를 기억해야 한다.
    : . single dot 은 현재 디렉토리를 의미한다. 현재 위치가 /home/eun 이고 eun 디렉토리의 하위 디렉토리인 bin 디렉토리로 가고 싶다면 cd ./bin 명령어를 입력하면 된다. cd home/eun/bin 이렇게 모두 입력하기 귀찮기 때문에 편리하라고 만들어진 특별한 심볼이다.
    : ..현재 디렉토리의 상위 디렉토리를 의미한다. 현재 디렉토리가 /home/eun/ 인데 /home/yerikim 디렉토리로 가고 싶다면 cd ../yerikim 명령어를 사용하면 된다.

  • 파일 경로도 디렉토리 경로와 똑같이 사용한다. /home/eun/bin 디렉토리 안의 test.py 파일을 열고 싶으면 open /home/eun/bin/test.py 라고 실행하면 된다.

4. Configs

리눅스에서는 설정을 주로 파일을 통해서 한다. 그리고 여러 config file(설정파일) 들이 있다. 그 중 가장 중요한 설정파일이 shell 설정파일이다. 각 shell 마다 고유 설정파일이 있고 Bash 는 .bashrc 라는 설정파일을 사용하고 zsh 는 .zshrc 라는 설정파일을 사용한다.

shell 설정파일을 비롯한 많은 설정파일들이 대부분 유저의 home 디렉토리에 있다. Zsh 설정파일도 마찬가지이다. 하지만 ls 명령어를 사용하면 zshrc 파일이 보이지 않는다. 그 이유는 .zshrc 파일 이름이 . 으로 시작하기 때문이다. . 으로 시작하는 파일이나 디렉토리는 자동으로 숨겨지게 된다. 이러한 파일을 "dot file" 이라고 한다.

dot file 을 보려면 ls 명령어에 -a 옵션을 줘야 한다. -a 는 all 의 약자이다. 숨겨진 파일이든 안 숨겨진 파일이든 나열하라는 뜻이다.

그렇다면 설정파일을 통해 무엇을 설정하는 것일까? 아주 많은 설정들을 할 수 있지만 그 중 가장 중요한 것은 PATH 설정이다.

5. PATH Environment Variable

환경변수란, shell(현재 돌아가고 있는 환경) 의 설정값을 가지고 있는 변수를 뜻한다. 환경변수들은 shell 이 돌아가는 동안 계속 존재하며 사용된다. echo $HOME 이라고 입력하면 HOME 환경변수 값이 출력된다. 이름에서 나오듯이 HOME 의 환경변수는 유저의 홈 디렉토리 경로이다.

> echo $HOME
/home/eun

HOME 이라는 변수를 선언한 적이 없지만 이미 존재하고 있다. 환경변수들은 shell 이 시작할 때 자동으로 선언되기 때문이다. shell 은 환경변수들을 통해 설정된다.

  • HOME : 유저의 home 디렉토리 경로를 저장한 환경변수
  • USER : 유저의 아이디를 저장한 환경변수
  • PATH : PATH 값을 저장한 환경변수

이 중에서 PATH 환경변수가 가장 중요한데, PATH 환경변수는 명령어들을 찾을 수 있는 경로들을 저장해놓은 환경변수이다.

명령어의 위치를 확인하고 싶다면 이렇게 한다. ls 명령어의 위치를 확인해보자.

> where ls
/bin/ls

우리가 ls 명령어를 입력할 때를 생각해보자. 명령어들도 프로그램이기 때문에 정확한 위치를 지정해야 shell 이 명령어를 찾아서 실행할 수 있다. 경로 없이도 실행이 되는 이유는 PATH 환경변수 때문이다. 명령어를 사용할 때 경로가 지정되어있지 않으면 shell 이 PATH 환경변수에 저장되어 있는 경로들을 확인해서 실행하고자 하는 프로그램의 위치를 찾은 후 실행시킨다.

PATH 값을 출력하면 다음과 같다.

> echo $PATH
/home/eun/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

각 경로들은 : 를 사용해서 구분한다.

ls 명령어가 입력되면 shell 이 PATH 환경변수값에 저장되어 있는 경로들을 맨 왼쪽 경로부터 하나씩 보면서 ls 라는 프로그램을 찾을 수 있는지 확인하고 찾으면 실행한다. ls/bin 에 위치해 있기 때문에 PATH 값의 7번째 경로에서 찾을 수 있다. 만일 못 찾는다면 못 찾는다는 에러메세지와 함께 실행 없이 종료된다.

PATH 가 중요한 이유는 새로운 package 를 설치하거나 시스템을 설정할 때 PATH 설정이 제대로 안되면 실행이 안되는 경우가 많기 때문이다. 예를 들어 python 의 가상환경 매니저인 miniconda 를 설치했는데 conda 가 실행이 안되는 경우 conda 의 경로가 PATH 에 설정이 안되어있을 확률이 높다.

PATH 는 shell 설정파일에서 설정한다. Zsh 의 경우 .zshrc 파일에서 설정하며 이렇게 한다.

export PATH="/home/eun/bin/anaconda3/bin:$PATH"

export 는 자바스크립트의 var 처럼 변수를 선언할 때 사용하는 키워드이다. PATH 변수의 값은 이렇게 설정한다.

<PATH에 추가하고자 하는 경로>:$PATH

$ 에는 PATH 변수의 값이 치환된다.

6. Shell 사용 꿀팁

  • shell 에서 ↑ 방향키를 누르면 이전에 입력했던 명령어를 불러낼 수 있다. 누르는 횟수에 따라 그 전, 그 전전 도 볼 수 있다.
  • Zsh 에서 history-substring-search 플로그인을 설치했으면 입력하고자 하는 명령어 중 일부분을 입력 후 ↑ 버튼을 누르면 입력된 stirng 이 포함된 이전 입력된 명령어만 불러낼 수 있다.
  • ctrl + a -> 커서가 해당 줄의 맨 앞으로 이동
  • ctrl + e -> 커서가 해당 줄의 맨 뒤로 이동

7. 기본적인 Shell 명령어

  1. mv: 파일 이동을 할 수 있다. 같은 폴더에서 파일 및 디렉토리를 이동할 경우 이름을 변경한다.
  2. cp: 파일 및 디렉토리를 복사한다.
  3. cat: 두 개 이상의 파일을 연결해서 출력할 때 사용한다.
  4. more: 특정 파일의 내용을 확인하는 페이지에서 바로 vi로 파일을 열어 편집을 할 수 있다.
  5. less: more 과 유사하다.
  6. head: 파일의 앞부분부터 확인한다.
  7. tail: 파일의 마지막 부분부터 확인한다. 특정 파일에 지속적으로 추가되는 내용을 확인할 때 용이하다.
  8. nohup: 터미널을 종료해서 프로그램이 계속 실행된다. 데몬 형태로 쉘스크립트파일을 실행시킨다고 생각하면 된다.
  9. rm: 파일 및 디렉토리를 삭제한다. 이때 rm -f [FILE] 를 통해 삭제확인과정을 거치지 않고 바로 삭제할 수 있다. (디렉토리만을 지울 때는 rmdir 명령어로 지울 수 있다.)
  10. mkdir: 새 디렉토리를 만들 때 사용한다.
  11. chown: 어떤 파일 및 디렉토리의 소유자를 변경한다.
  12. chmod: 어떤 파일 및 디렉토리의 사용권한을 변경한다.
  13. grep: 정규 표현식에 의한 패턴 매칭 방식으로 특정 문자열을 찾을 수 있다.
  14. history: 접속한 사용자가 쉘에 입력한 내용을 기록하는 것이다.
  15. ps: 현재 실행 중인 프로세스의 목록을 볼 수 있다.

8. Piping

  • |
  • pipe 하고 하며 일반적인 명령어가 아니라, 2개의 명령어를 이어주는 역할을 한다.
  • command1 | command2
  • command1 의 결과값을 command2 의 input 으로 넘겨준다.
  • 예를 들어 history 명령어는 이제까지 입력한 명령어들을 출력해주는 명령어다. history 만 실행하면 결과값이 화면에 출력되지만 | 를 사용해 grep 과 같이 사용하면 history 가 출력하는 값들 중 원하는 값만 필터링을 할 수 있다. 이렇게 -> history | grep ls

9. Man page

  • manual page 를 줄여서 man page 라고 한다.
  • 명령어를 어떻게 쓰는지 설명해주는 역할을 한다.
  • man ls
  • man page 의 단점은 너무 길다는 것이다. 너무 길어서 읽기가 힘들다. 그래서 최근에 tldr 이라는 유용한 package 가 나왔다. (Too long didn't read) tldr 명령어는 자주 사용하는 옵션이나 사용법만 간략하게 알려준다.
  • tldr ls
  • default 로 포함되어 있는 package 가 아니므로 package manager 를 사용해 설치해야 한다.

리눅스 세션

  1. 리눅스는 무엇인가?
    : 리눅스는 시스템 운영에 사용되는 운영체제이다. 안드로이드도 리눅스 기반으로 만들어졌다.
  2. 리눅스는 누가 만들었나?
    : Linus Torvals 가 만들었다.
  3. 리눅스의 루트경로는 무엇인가?
    : 리눅스 운영체제에서 파일은 트리 구조로 되어있다. 트리 구조의 최상위 폴더를 root 폴더라고 한다. / 이렇게 적는다. root 로 이동하려면 터미널에 cd / 이렇게 적어준다.
  4. 리눅스의 홈 디렉토리는 무엇인가?
    : home directory 는 유저의 실제로 사용하는 공간이다. home 에서 많은 작업을 하게되고 아주 중요하기 때문에 home 루트를 이용하는 방법에는 여러개가 있다. 1. 홈으로 이동하려면: cd 2. 홈 하위의 폴더(or) 파일로 이동하려면 cd ~/bin

0개의 댓글