리눅스

Linux Basic

UnoCode 2020. 8. 7. 22:13

Linux는 1991년 Linus Torvals가 개발한 운영체제 입니다. 이분은 여전히 살아 있고 아직까지 Linux개발을 이끌고 있습니다.

 

Linus Torvals

인상 깊은 사진입니다.

 

Linux는 서버를 운영하는데 가장 널리 사용되는 운영체제 입니다. Windows 시스템이나 app이 아닌 이상 일반적으로 서버는 Linux로 돌아 간다고 보시면 됩니다.

 

Linux에서 가장 기초 적인 4가지 개념

 

- Linux 디렉토리 구조

 

- PATH

 

- Configs

 

-Shell commands

 

처음에는 익숙치 않아서 어려울수 있으나 계속 Linux를 사용하다보면 자연스럽게 습득이 되는 내용들 입니다.

 

그러니 이해가 안가시더라도 이런게 있구나 하시는 마음으로 보시기 바랍니다.

 

1. Linux 디렉토리 구조

 

리눅스 디렉토리 구조 (그림 출처 http://www.doc.ic.ac.uk/~wjk/UnixIntro/Lecture2.html) 출처:  https://webdir.tistory.com/101  [WEBDIR] 출처:  https://webdir.tistory.com/101  [WEBDIR]

Linux의 최상단에는 "/"가 있습니다. 

 

window 

- root : c:

- 디렉토리 구분 \

 

Linux

- root : /

- 디렉토리 구분 /

 

 

- cd : 폴더를 이동하는 명령어 입니다.

 

-pwd : 현재경로를 알려주는 명령어 입니다.

 

디렉토리 경로

 

디렉토리 경로에는 2가지 유형이 있습니다. (절대경로,상대경로)

 

 절대경로(Absolute Path)는 이름 그대로 절대 경로 입니다.  여기서 Absolute는 "완전한"의 뜻과 비슷하다고 할 수 있는데요

즉 완전한 경로 라는 뜻으로 해석하시면 되겠습니다.

 

root 디렉토리 부터 시작하는 경로를 뜻하고 /home/enu/bin 이런식으로 사용합니다.

 

상대경로(Relative Path)

 

이름 그대로 "상대적인" 경로 라는 의미입니다. 현재 내 위치와 상관없이 이동 할 수 있는 Absolute Path와 달리 relative Path는 현재 내 위치를 기반으로 이동 할 수 있습니다. 여기서 중요한 심볼인 .과 ..에 대해서 좀더 알아보겠습니다.

 

경로를 이야기 할때 .(single dot)은 현재 디렉토리를 이야기 합니다. 예를 들어 현재 /home/enu 디렉토리에 위치해 있을 경우

eun 디렉토리의 하위 디렉토리 인 bin 디렉토리로 가고 싶다면 cd ./bin 명령어를 입력 하면 됩니다. 여기서 .은 현재 디렉토리를 의미하며 cd /home/enu/bin과 동일하다고 볼 수 있습니다.

 

..는 현재 디렉토리 바로 전 디렉토리, 즉 현재 디렉토리의 상위 디렉토리를 의미합니다. 예를 들어 현재 디렉토리가 /home/enu/인데

/home/kim 디텍토리로 이동 하고 싶다면 ../kim 명령어를 사용하면 됩니다. /home/enu에서 ..는 상위 디렉토리 즉 /home 디렉토리를 뜻합니다.

 

File Path

지금까지는 디렉토리에 관한 경로만 보았는데 파일로 가는 경로도 디렉토리 경로와 동일합니다. 에를 들어 /home/enu/bin 디렉토리 안에 test.py라는 파일을 열고 싶다면 open /home/enu/bin/test.py 라고 실행하면 됩니다.

 

Config

리눅스에는 설정을 주로 파일을 통해서 합니다. 그리고 여러  config file, 즉 여러 설정 파일들이 있습니다. 너무나 다양한 설정 파일들이 있지만 여기서는 가장 중요하다고 생각하는 bash는 .bashrc 라는 설정 파일을 사용하고  zsh은 .zshrc라는 설정 파일을 사용합니다.

 

먼저 zsh 설정 파일의 위치를 알아보도록 합시다. Shell 설정 파일은 비롯한 많은 설정 파일들이 대부분 유저의 home 다이렉토리에 있습니다. Zsh 설정 파일도 마찬가지 입니다. 하지만 ls 명령어를 사용하면 .zshrc는 보이질 않는다. 그 이유는 .zshrc 파일은 숨겨져 있는 hidden file이기 때문이다.  .zshrc 파일 이름이 . 으로 시작하는 파일을 "dot file"이라고 한다.

 

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

 

PATH Enviroment Variable

 

PATH 환경 변수를 이해할려면 먼저 environemnt variable,  즉 환경 변수가 무엇인지 알아 보겠습니다. 변수는 말 그대로 variable 입니다. 어떠한 값을 저장하고 있는 변수 입니다. 그런데 그 앞에 environemnt "환경" 이라는 단어가 붙어 있습니다.

그렇다면 여기서 환경이란 무엇일까요? 여기서 환경은 현재 돌아가고 있는  shell을 뜻합니다. 그러므로 환경 변수란 shell의 어떠한 설정 값을 가지고 있는 변수를 의미합니다. 대표적인 예로는 ehco $HOME 이라고 입력 해보면은 HOME환경 변수의 값을 알 수 있습니다.

 

 

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

환경 변수들 중 꼭 이해해야 하는 변수는 PATH 이다. PATH 환경 변수는 명령어들을 찾을 수 있는 경로들을 저장해놓은 환경 변수 이다.

예를 들어, 앞서 이미 실행해 본 ls 명령어를 보자. 실제 ls 명령어는 /bin 디렉토리 안에 위치해 있다. whereis 명령어를 사용하면 알 수 있다.

> whereis ls
/bin/ls

 

하지만 우리가 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

 

하나의 긴 경로 처럼 보일 수 도 있지만 실은 여러 경로를 담고 있으며 각 경로들을 : 를 사용해서 구분한다.

 

  1. /home/eun/bin
  2. /usr/local/sbin
  3. /usr/local/bin
  4. /usr/sbin
  5. usr/bin
  6. /sbin
  7. /bin
  8. /usr/games
  9. /usr/local/games
  10. /snap/bin

그리하여 ls 명령어가 입력되면 shell이 PATH 환경 변수 값에 저장되어 있는 경로들을 맨 왼쪽 경로(1번) 부터 하나 하나 보면서 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 는 JavaScript의 var 키워드 처럼 변수를 선언할때 사용하는 키워드라고 생각하면 된다. PATH 변수의 값이 중요한데, 다음 처럼 값이 선언되어 있다:

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

여기서 $PATH 부분은 PATH 변수의 값이 치환된다.

 /home/eun/bin/anaconda3/bin 라는 경로는 PATH 에 추가 하고 싶으면 다음 처럼 추가하는 경로를 먼저 선언하고 그 다음 :, 그리고 $PATH를 선언 하는것이다. 그럼 기존의 PATH 값의 묀 앞쪽에 새로운 경로가 추가가 된다.

 

 

Useful Shell Tips

 

  • Shell 에서 ⬆️(위방향 화살표 버튼)을 눌르면 이전에(previously) 입력했던 명령어를 다시 불러낼 수 있다. ⬆️ 를 또 눌르면 이전 그 이전에 입력했던 명령어가 나오면서 이전 명령어들을 계속해서 볼 수 있다.
  • Zsh에서 history-substring-search 플러그인을 설치 했으면 (이 전 과제를 했다면 설치가 됬을것이다) 입력하고자 하는 명령어중 일부분을 입력 후 ⬆️ 버튼을 눌르면 입력된 string이 포함된 이전 입력된 명령어만 불러낼 수 있다.
  • Control + a 눌르면 커서가 해당 줄의 맨 앞으로 이동한다.
  • Control + e 눌르면 커서가 해당 줄의 맨 뒤로 이동한다.
  • Mac에서 Commnad + k 버튼을 눌르면 화면이 reset 된다. 화면에 출력된 것이 너무 많아서 복잡할때 사용하면 깔끔하다.

Basic Shell Commands

Shell 명령어들을 잘 알고 익숙해져야 linux를 잘 쓸수 있다. 다음은 기본적인 shell 명령어 들이다. 찾아보고 직접 실행해 봐서 익숙해지도록 하자.

  • cd
  • ls
  • mv
  • cp
  • cat
  • less
  • tail
  • nohup
  • rm
  • mkdir
  • clear
  • pwd
  • chown
  • chmod
  • grep
  • history
  • ps

Piping

                                |||||||||||

  • Pipe 이라고 한다. 위에서 아래로 내려가는 줄이 꼭 파이프 기둥 처럼 생겨서 그렇게 이름이 붙어졌다.
  • Pipe는 일반적인 명령어가 아니라 2개의 명령어를 이어주는 역활을 한다.
  • command1 | command2
  • command1의 결과값을 command2의 input으로 넘겨준다.
  • 예를 들어, history 명령어는 이제까지 입력한 명령어들을 출력해주는 명령어다. history 만 실행하면 결과값이 화면에 출력 되지만 | 를 사용해 grep 과 같이 사용하면 history가 출력하는 값들 중 원하는 값만 필터링을 할 수 가 있다.
  • history | grep ls

Man page

  • Manual page를 줄여서 man page 라고 한다.
  • 명령어를 어떻게 쓰는지 설명해 주는 역활을 한다.
  • man ls
  • Man page의 단점은 너무 길다는 것이다. 글이 너무 많아서 읽기가 힘들다. 그래서 최근에 나온 유용한 package가 있다. 바로 tldr 이다 (Too Long Didn't Read). tldr 명령어는 자주 사용하는 옵션이나 사용법만 간략하게 알려준다.
  • tldr ls
  • 다만 default로 포함되어 나오는 package가 아님으로 package manager를 사용해서 설치 해야 한다.