TIL # 25 (Linux & Terminal)

Mikyung Lee·2021년 1월 19일
0
post-thumbnail

Linux File System Hierarchy (FHS)

Linux의 파일 구조는 다음과 같은 tree 형태로 되어 있다.

FHS의 가장 위에는 / 디렉토리가 있다. Root 디렉토리 (directory) 라고 한다. Root은 뿌리 라는 뜻이다. 즉 Tree 형태의 FHS의 뿌리가 된다는 뜻이다. 참고로 디렉토리 (directory)는 윈도우스의 폴더(folder)와 동일한 개념이다.

시작점인 root 디렉토리 안에 여러 하위 디렉토리들이 있고 각 하위 디렉토리들안에 또 하위 디렉토리 들이 있는 식이다. 그리고 각 디렉토리들은 slash (/) 로 구분한다. 참고로 윈도우스는 back slash (\) 로 구분한다. 예를 들어, root 디렉토리 안에 home 이라는 하위 디렉토리가 있고 그 안에 eun 이라는 하위 디렉토리가 있고 그 안에 bin 이라는 디렉토리가 있다면 해당 bin 디렉토리까지의 경로는 다음과 같이 표현한다.

/home/eun/bin

실제로 터미널에서 linx 파일 구조를 보도록 하자.먼저 터미널에서 다음 명령어를 입력하여 root 디렉토리로 가보자.

cd /

  • cd 명령어는 "change directory"의 약자로 특정 디렉토리로 이동할때 사용된다. cd 명령어 다음에 가고자 하는 디렉토리 경로를 입력하면 된다. 여기서는 root 디렉토리로 가기 때문에 / 하나만 입력했다. 만일 root 디렉토리의 하위 디렉토리인 home 디렉토리 의 하위 디렉토리인 eun 디렉토리의 하위 디렉토리인 bin 디렉토리로 가고자 한다면 /home/eun/bin 을 입력해야 한다.

Root 디렉토리로 변경했으면 ls 명령어를 실행하자. ls 명령어는 list의 약자이며 해당 디렉토리의 내용물들을 나열해주는 역활을 한다. 다음과 비슷한 결과물을 볼 수 있을 것이다.

Root 디렉토리 안에 많은 하위 디렉토리들이 있는 것을 볼 수 있다. 그 중 home 디렉토리가 있는것을 볼 수 있다. home 디렉토리 안으로 가보면 자신의 유저 아이디와 동일한 디렉토리가 있을것이다. 예를 들어, 저자의 경우 eun 이라는 디렉토리가 있다. 이 디렉토리가 바로 유저의 home 디렉토리 이다.

Home Direcotry
Linux file system에는 여러 디렉토리가 있지만 그 중 가장 중요하고 기본이 되는 디렉토리는 바로 home 디렉토리 이다. 왜냐하면 home 디렉토리가 유저의 공간이기 때문이다. 주로 home 디렉토리에서 많은 것을 하게 된다.
cd 명령어를 실행할때 디렉토리 경로를 생략하고 cd 만 입력하면 자동으로 home 디렉토리로 이동한다.

그 뿐만이 아니다. Home 디렉토리 경로를 나타낼때 ~ (tilda) 를 사용해서 나타낼수 있기 까지 하다. 예를 들어, cd ~ 명령어를 사용하면 home 디렉토리로 간다. 또한 cd ~/bin 명령어를 사용하면 home 디렉토리의 하위 디렉토리 bin 디렉토리로 이동한다. 즉 ~ == /home/eun 이다 (여기서 eun은 저자의 경우 이다. 다른 유저는 해당 유저의 home 디렉토리일것이다).

Directory 경로

Absolute Path

Absolute path는 이름 그대로 절대적 경로 이다.

Absolute, 즉 "절대적" 이라는 이름이 붙으니 뭔가 반지의 제왕에 나오는 절대반지 가 생각날 수 도 있지만, 여기서 absolute의 의미는 "완전한"에 더 가깝다. 즉 완전한 경로이라는 뜻이다. Absolute path는 root 디렉토리 부터 시작하는 경로를 뜻한다.

앞서 보았던 /home/eun/bin 가 absolute path 이다. Root 디렉토리에서 부터 시작하기 때문에 현재 나의 위치와 상관 없이 항상 정확히 해당 경로로 이동 할 수 있다.

Relative Path

Relative path는 이름 그대로 "상대적인" 경로 이다.

현재 내 위치와 상관없이 이동 할 수 있는 absolute path와 다르게 relative path는 현재 내 위치를 기반으로 움직이는 경로이다. 여기서 기억해야할 중요한 2가지 심볼이 있다. . 과 .. 이다.

경로를 이야기 할때 . (single dot) 은 현재 디렉토리를 이야기 한다. 예를 들어, 현재 /home/eun 디렉토리에 위치해 있는데 eun 디렉토리의 하위 디렉토리 인 bin 디렉토리로 가고 싶다면 cd ./bin 명령어를 입력하면 된다. 여기서 . 은 현재 디렉토리를 뜻함으로 cd /home/eun/bin 과 동일하다. 디렉토리 경로가 길 경우 매번 긴 경로를 다 입력하기 귀찮음으로 편리하라고 만들어진 특별 심볼이다.

.. 는 현재 디렉토리 바로 전 디렉토리, 즉 현재 디렉토리의 상위 디렉토리를 뜻한다. 예를 들어, 현재 디렉토리가 /home/eun/ 인데 /home/yerikim 디렉토리로 가고 싶다면 cd ../yerikim 명령어를 사용하면 된다. /home/eun 디렉토리 에서 .. 는 상위 디렉토리 즉 /home 디렉토리를 뜻함으로 ../yerkim == /home/yerikim 이 된다.

File Path

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

Configs

Config file

리눅스에는 설정을 주로 파일을 통해서 한다. 그리고 여러 config file, 즉 여러 설정 파일들이 있다. 너무나 다양한 설정 파일들이 있어서 다 알기가 힘들 정도 이다. 그 중 가장 중요한 설정 파일이 바로 shell 설정 파일이다. 각 shell 마다 고유 설정 파일이 있다. Bash는 .bashrc 라는 설정파일을 사용하고 zsh는 .zshrc 라는 설정 파일을 사용한다.

앞서 Zsh를 이미 설치했을것임으로 Zsh 설정 파일을 보도록 하자.

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

dot file을 볼려면 ls 명령어에 a 옵션을 주어야 한다. 여기서 a는 all 의 약자인다. 즉 숨겨진 파일이든 안숨겨진 파일이든 다 나열 하라는 뜻이다.


위의 경우 zsh이 설치 되어 있지 않고 bash 쉘을 사용하기 때문에 .bashrc 파일이 있는 것을 볼 수 있다.

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

PATH Enviroment Variable

PATH 환경 변수를 이해할려면 먼저 environemnt variable, 즉 환경 변수가 무엇인지 알아보자. 변수는 말 그대로 variable 이다. 즉 어떠한 값을 저장하고 있는 변수 인것이다. 그런데 그 앞에 environment, "환경" 이라는 단어가 붙었다. 여기서 환경이란 무엇이겠는가? 여기서 환경은 현재 돌아가고 있는 shell을 뜻한다. 그럼으로 환경 변수란 shell의 어떠한 설정 값을 가지고 있는 변수를 뜻한다. 그리고 이러한 환경 변수들은 shell이 돌아가는 동안 계속 존재하며 사용된다. 그 증거로 echo $HOME 이라고 입력해보자. HOME 환경변수 값을 출력할 것이다 (그리고 이름에서 나오듯이 HOME 환경 변수는 유저의 홈 디렉토리 경로이다).

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

리눅스에는 여러 환경 변수들이 있는데 그 중 대표적인 환경 변수들은 다음과 같다.

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

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

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

하지만 우리가 ls 명령어를 사용할때는 정확한 경로를 입력하지 않고 그냥 ls 만 입력한다. 그럼에도 불구하고 터미널에서 실행이 잘된다. 명령어들도 결국 프로그램이기 때문에 어디에 위치해 있는지 정확한 경로를 알아야 shell이 찾아서 실행할 수 있을것이다.

그러나 경로 없이도 실행이 되는 이유는 바로 PATH 환경 변수 때문이다. 명령어를 사용할때 만일 경로가 지정되지 않으면 shell이 PATH 환경 변수에 저장되어 있는 경로들을 하나 하나 보면서 실행 하고자 하는 프로그램이 위치해 있는지 찾는다. 그리고 찾으면 실행 시킨다.

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

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

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

PATH 는 shell 설정 파일에서 설정한다. Zsh의 경우 .zshrc 파일에서 설정하며 다음처럼 설정한다.

처음 보는 문법이라 생소 할 수 있다. 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를 사용해서 설치 해야 한다.



  • 각 폴더별 특징

    • / (root)

      • 루트 폴더. 최상위 경로. / 기호로 접근할 수 있다.
    • /bin & /sbin

      • 윈도우 : C드라이브/windows/system32 폴더
      • Binary의 약자. OS의 최소한의 구동을 위해 필요한 프로그램이 들어있는 폴더. cat, chmod, chown, cp, date, echo, kill, ln, ls, mkdir, etx 와 같은 기초적인 프로그램들이 포함.
      • sbin 폴더는 bin과 유사하지만 오직 루트유저 전용 프로그램 포함.
    • /boot

      • 윈도우 : C드라이브/windows/system32 폴더, boot.ini
      • 부트로더 같이 시스템 부팅에 필요한 파일들이 위치.
    • /usr

      • 윈도우 : C드라이브/Users/사용자1
      • user의 약자. 각 유저 이름에 해당하는 폴더이름이 존재. 각 폴더마다 bin, sbin, shared, lib과같이 각 유저들이 사용할 수 있는 폴더가 생성되어 있음. 각각의 유저별로 다른 파티션으로 존재하기 때문에 다른 사용자들이 사용할 수 있도 록 마운트할 수 있지만 이 경우 수정할 수는 없음.
    • /home (~)

      • 윈도우 : C드라이브/Users/사용자명 ⇒ 바탕 화면, 다운로드, 내 문서
      • 유저의 공간. 가장 빈번하게 사용하게 되는 경로. Home 디렉토리 이외의 다른 디렉토리 들은 주로 system directory 라고 하는데, 즉 리눅스의 운영과 관리에 관련한 파일들이 존재하는 디렉토리들. ~ 기호로 곧바로 접근할 수 있다.
    • /etc

      • etc 폴더에는 시스템 전체에서 사용하는 설정 정보 등 엑스트라 데이터들이 저장됨.
    • /cdrom

      • 윈도우 : E, F 드라이브
      • cdrom을 위한 마운팅 포인트. 잘 사용되지 않음.
    • /media & /mnt

      • Media는 OS에서 자동으로 마운팅해주는 포인트, Mnt는 사용자가 직접 마운트하는 경로로 사용됨. 예를 들어 컴퓨터에 USB꽂아 OS에 자동으로 마운팅된다면 주로 Media 폴더, 외부에 있는 디스크등을 직접 명령어를 통해 마운트한다면 Mnt 디렉토리에 위치하게 됨.
    • /dev

      • device의 약자. 모든 것은 파일이다 라는 모토에 맞게 키보드, 마우스, 프린터등과같은 디바이스들은 파일 또는 디렉토리의 형태로 dev 폴더 안에 존재. 읽기 쓰기도 가능하며 디렉토리 어디서든 접근 가능.

:: PATH


  • / : root 디렉토리

  • ~ : home 디렉토리

  • 절대 경로 : Absolute path는 이름 그대로 절대적 경로. 경로를 표현하는 방식이 root 디렉토리 부터 시작한다는 점에서 "완전한"의 의미에 더욱 가까움. (ex. /home/eun/bin)

  • 상대 경로 : Relative path. 현재 자신의 위치를 기반으로 움직이는 경로. (ex. cd ..)

    • . : 현재 경로
    • .. : 상위 경로
  • 환경 변수 : 경로에 대한 변수라고 생각하면 쉽다

    • 여러분이 프로그램을 개발해서 배포하려는 상황.

    • 대부분 C드라이브에 윈도우가 설치되어 있을 것으로 가정하고, C → program files/프로젝트 명으로 설치하도록 설정. 만약 사용자의 OS가 설치된 드라이브가 D라면 설치에 실패할 것. 이 경우 C:\program files는 변수처럼 처리되어야 한다.

    • echo $변수명 : echo 뒤에 나오는 문자열은 화면에 출력된다. echo $PATH의 실행결과는 다음과 같다. 즉, 경로에 대한 정보가 직렬화 된 문자열로 저장되어 있는 것. 명령어를 사용할 때 경로가 지정되어 있지 않으면 shell이 $PATH에서 실행하고자 하는 프로그램이 존재하는지 여부를 하나씩 체크한다. 있으면 실행한다. 각 경로는 : 으로 구분된다.

      /Library/Frameworks/Python.framework/Versions/3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
    • 실제 ls 명령어는 /bin 디렉토리 안에 위치해 있다. whereis ls 를 입력해보자. 해당 명령어가 위치해 있는 경로를 별도로 지정해주지 않더라도 어디서든 사용이 가능한 이유 역시 환경 변수 덕분이다.

/, ~, 절대경로, 상대경로, ., .., 환경변수가 무엇인지만 가볍게 짚어보기!

:: Configs


  • 리눅스에서는 주로 파일을 통하여 설정(config). (ex. .bashrc, .zshrc)

    • shell 설정 파일을 비롯한 많은 설정 파일들이 대부분 유저의 home(~) 디렉토리에 있음.

  • . 으로 시작하는 파일 및 디렉토리는 숨김파일로 간주(dot file)

  • lsa 옵션을(all) 주어야지만 볼 수 있음.

  • alias(별칭, "다른 방법으로") : 일종의 사용자 지정 단축 명령어 (.zshrc, .bashrc 등에 등록)

    alias myip="ipconfig getiadder en0" # macOS
    alias myip="hostname -I" # ubuntu
profile
front-end developer 🌷

0개의 댓글