10일차(1) - Linux 기초

dudu00·2022년 11월 5일
0

codestates

목록 보기
8/25

1. Command-Line Interface

GUI가 할 수 있는 모든 작업은 CLI로 할 수 있다.
다만 사람이 키보드로 입력하면,
모니터에 글자로 출력하기 때문에 GUI에 익숙해진 사람한테는 낯설뿐

GUL 와 CLI

1-1 CLI 명령어

우분투
단축키 : 컨트롤 + 알트 + T

터미널은 CLI(Command-Line Interface)
입력하는 글자와 출력되는 글자로 컴퓨터와 소통할 수 있다.
컴퓨터가 출력하는 글자를 읽을 수 있어야 한다.

프롬프트

(1) pwd: 현재 위치 확인하기

GUI에서는 "현재 폴더가 위치한 경로"를 확인하기 위해
탐색기의 상단을 클릭해서 확인.

디렉토리(directory)는 폴더

(2) mkdir : 새로운 폴더 생성하기

make directories의 약자로, 폴더를 만들라는 명령을 컴퓨터에 전달
생성된 폴더 확인하기 위해서는,
현재 폴더에 포함된 파일이나 폴더의 이름을 출력하는 명령어가 필요. >> ls

(3) ls : 특정 폴더에 포함된 파일이나 폴더 확인하기

list의 약자, 특정 폴더에 포함된 파일이나 하위 폴더의 리스트 출력
CLI에서 특정 명령어의 옵션을 사용하는 경우 - 를 이용해 옵션 입력했다고 컴퓨터에 전달
대쉬(-) 뒤에 오는 옵션의 순서는 기능에 영향을 미치지 않는다.

 - ls -l  
 ㅡ> 가장 왼쪽에 d 와 - 를 확인.
 ㅡ> d로 출력된 경우는 폴더를, -로 출력된 경우는 파일을 나타낸다.
 폴더는 다음 명령어 cd를 통해 진입할 수 있지만, 파일이라면 진입할 수 없다
 - ls -a
 - ls -al 또는 ls -la
 옵션 a는 "all"이라는 의미

(4) 명령어를 이용해 폴더를 GUI의 탐색기로 실행하기

wsl2 ㅡ> 주소창에 \wsl$ 의 값을 넣으면 네트워크 환경으로 접속이 가능

바탕화면 또한 하나의 폴더

Ubuntu ㅡ nautilus .
[커맨드] Ubuntu에서 현재 위치를 GUI로 실행하는 명령어 nautilus
가상머신은 안되는지 확인@@

(5) cd: 폴더에 진입하기

cd ㅡ change directory의 약자
prompt로 상호작용하는 폴더를 다른 폴더로 변경한다는 의미

(6) touch: 파일 생성하기

텍스트 파일 "hi.txt"
파일을 만들기 위해 touch 명령어@

ex) touch hi.txt

(7) GUI로 파일에 텍스트 입력하기

(8) cat: 파일의 내용을 터미널에 출력하기(파일의 모든 내용을 출력)

cat hi.txt
이메일 뒤에 다른 문자가 붙어있다면, 한 줄의 끝에 Enter(엔터 키)를 누르지 않은 것뿐

@@ 기타

폴더를 생성하는 명령어는 mkdir
폴더 또는 파일의 이름에 공백(띄어쓰기)이나 특수문자가 있으면, 백슬래시()를 이용해 적용
폴더로 진입하는 명령어는 cd

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

1-2 CLI 명령어(2)

(1) rm : 폴더나 파일 삭제하기

  • 명령어 rm으로 삭제한 폴더나 파일은, 휴지통을 거치지 않고 삭제
    rm은 단일 파일을 삭제할 수 있다.
  • 폴더 삭제하려면 옵션 이용(r과 f)
    옵션 r은 폴더를 지울 때 사용하고, 옵션 f는 질문을 받지 않고 지울 때 사용
    우리는 폴더나 파일을 삭제할 때 두 옵션을 같이 사용
rm -rf bye

(2) mv : 폴더나 파일의 이름을 변경, 또는 폴더나 파일의 위치 옮기기

  • 명령어 mv는 move의 약자로, 폴더나 파일을 이동할 때 사용
mkdir bye           # bye 폴더를 생성
touch bye.txt       # bye.txt 파일을 생성
  • mv 뒤에는 순서대로 [폴더나 파일의 이름][도착 폴더의 이름]를 입력
mv bye.txt  helloWorld.txt
  • 폴더나 파일의 이름을 변경할 수 있다.
    명령어 mv를 사용하기 위해 필요한
    [폴더나 파일의 이름]에는, 변경할 폴더나 파일의 이름을 입력
    [도착 폴더의 이름]을 대신해, 변경하고자 하는 파일의 이름을 입력

(3) 컴퓨터가 파일을 옮기거나 복사하는 방법

  • 컴퓨터가 파일을 옮기는 방법
    a. 파일의 내용을 잠시 저장한다.
    b. 원래 위치의 파일을 삭제한다.
    c. 도착 폴더에 1에서 저장한 내용으로 새로운 파일을 생성한다.
  • 컴퓨터는 파일을 옮기기 위해 잠시 저장한다.
    파일을 복사하는 경우에는 파일을 옮기는 아래의 과정 중에서,
    원래 위치의 파일을 삭제하는 과정이 제외된다.
  • 컴퓨터가 파일을 옮기는 방법
    a. 파일의 내용을 잠시 저장한다.
    b. 도착 폴더에 1에서 저장한 내용으로 새로운 파일을 생성한다.

(4) cp : 폴더나 파일을 복사하기

  • copy의 약자.
    파일을 복사. 파일을 복사하기 위해 명령어 cp를 사용하는 경우에는,
    cp [원본 파일 이름][복사할 파일 이름]을 프롬프트에 입력
  • CLI에서 .은 현재 폴더를 나타낸다.
    ..은 현재 폴더(.)을 기준으로, 앞에 .이 하나 더 붙습니다.
    이렇게 만들어진 ..은 현재 폴더보다 앞에 있는 폴더를 가리킨다
  • 폴더를 복사를 위해 명령어 cp를 그냥 사용하면, 명령어 rm으로 폴더를 삭제할 때처럼 메시지가 출력
    명령어 cp에 사용하는 옵션은, 명령어 rm에 사용하는 옵션과 동일
cp -rf bye hi
ls
ㅡ> bye hi 가 출력

@@기타

폴더나 파일을 복사하는 명령어는 cp
명령어 cp를 이용해 폴더를 복사할 때에는 옵션-r이 반드시 포함되어야 한다

상위 폴더로 이동하기 위한 상대 경로는 ../
현재 폴더의 위치가 ~/helloWorld/hello/이므로, 상위 폴더의 절대 경로는 ~/helloWorld/입니다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

1-3 관리자 권한과 경로

  • 운영체제에는 사용자와 관리자가 있다.
    관리자는 사용자가 접근 못하는 영역에도 접근 O
    새로운 프로그램을 설치하거나 변경 또는 삭제할 때 관리자 권한이 반드시 필요하기 때문에,
    특정 명령어를 입력하는 것으로 잠시 관리자 권한을 빌려올 수 있다

(1) 절대 경로와 상대 경로

  • 경로
    명령어 pwd로 확인할 수 있는 절대 경로
    현재 위치로부터 상대적인 위치를 나타내는 상대 경로
  • 절대 경로는 기준점으로부터의 절대적인 위치를 나타내는데, 기준점은 루트 폴더(/)
    정리하면, 절대 경로는 특정 폴더나 파일이 루트 폴더로부터 어떤 폴더로 진입하는 경우 만날 수 있는지 나타낸다.
Ubuntu
/home/[username]/helloWorld/hello/
루트 폴더(/)에는 폴더 home이 있다.
폴더 home으로 진입하면, 폴더 [username]을 확인할 수 있다.
폴더 [username]에 진입하면, 폴더 helloWorld가 있고,
폴더 helloWorld에 진입하면
폴더 hello를 발견할 수 있다. 이 과정을 한 줄로 줄여놓은 구문
(/home/[username]/helloWorld/hello/)이 절대 경로
  • 상대 경로는 특정 폴더 또는 파일의 위치를 현재 위치를 기준점으로 나타낸다.
    현재 위치한 폴더는 점(.)으로 표현하고, 상위 폴더는 두 개의 점(..)으로 표현.
  • 현재 경로(/Users/[username]/helloWorld/hello/)에 포함된 폴더나 파일을 확인하기 위해, 명령어 ls를 사용할 수 있다.

명령어 ls를 통해 확인되는 폴더나 파일은, 상대 경로로써 ./을 붙여 표현할 수 있다.
만약 현재 폴더 아래의 폴더 hi로 진입하려고 한다면, 명령어 cd를 이용할 수 있다.
점(.)은 현재 폴더를, 슬래시(/)는 폴더 내부를 나타낸다.
따라서 다음 표현에 포함된 ./는 "현재 폴더 아래의"라는 뜻
./hi는 현재 폴더 아래의 폴더 hi를 나타낸다. 명령어 cd와 함께 사용한다면, 현재 폴더 아래의 폴더 hi로 진입하라는 뜻입니다.

cd ./hi # 현재 폴더 아래의 hi 폴더로 진입하는 명령
pwd
# (Ubuntu) /home/[username]/helloWorld/hello/hi
# (macOS) /Users/[username]/helloWorld/hello/hi
ls
# helloWorld.txt hiComputer.txt
점슬래쉬(./)는 현재 폴더
mv 명령어와 상대 경로를 이용해 helloWorld.txt파일을 상위 폴더로 이동
ㅡ> mv helloWorld.txt ../../

(2) 관리자 권한

  • 관리자 영역을 실수로 변경하면, 운영체제(Operating System)이 먹통이 될 수 있다.
  • 절대 경로의 기준점인 루트 폴더(/)는 Linux의 관리자 영역
    루트폴더에서는 mkdir 명령어로 test 폴더를 생성할 수 없다.

루트폴더는 관리자의 영역이기 때문에 사용자 권한으로는 할 수 있는 일이 없다

현재 로그인된 사용자를 확인하는 명령어ㅡ>프롬프트에 명령어 whoami를 입력
whoami
  • 사용자 권한은 username 폴더 내에서만 자유롭게 사용할 수 있다.
  • 사용자 폴더의 경로(Path)는 ~/로 표시된다.
    물결 기호(~)는 루트폴더(/)로부터 사용자 폴더(username)까지의 경로를 축약한 형태.
/ ㅡ> home ㅡ> user
유저안에 workspace 등등 기본 여러 폴더들 있음
그리고 /에서 user까지의 경로를 ~로 압축한게
ㅡ> ~$**

(3) sudo: 관리자 권한을 획득하는 명령어

명령어 sudo는 사용자 환경에서, 관리자 권한을 획득하는 명령어

@@ 퀴즈

경로 /etc/는 루트폴더 아래의 폴더 etc.
사용자 권한을 벗어난 위치에서 새로운 파일을 생성하므로,
반드시 관리자 권한이 필요함.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

1-4 텍스트 에디터 nano

  • vs code 같은 GUI 에디터 말고 , 터미널에서 자유자재로 다룰 수 있는 에디터가 하나쯤은 있어야 한다

(1) nano 실행하기

  • GUI 에디터인 VScode를 역시 아래와 같이 CLI에서 실행할 수 있다.
code hello.js   # hello.js 를 VScode에서 엽니다.
ㅡ> 실제로 가상 환경에서 vs code 창 실행된다

[커맨드] CLI 환경에서 hello.js를 VScode로 여는 방법

nano hello.js        # hello.js 를 nano에서 연다
nano        # 그냥 실행할 수도 있다.

[커맨드] 텍스트 에디터 nano를 실행

(2) 파일 열기

  • 파일을 열기 위해서는 단축키 화면에 표시된 것처럼 ^R, 즉 Ctrl + R 키 조합을 의미
    기본적으로 파일 이름을 입력하도록 화면이 안내되어 있지만,
    즉시 ^T Ctrl + T를 누른 후 화살표 키를 이용해 파일 및 디렉토리를 탐색한 후 불러올 수도 있다
  • 하지만, 역시 가장 쉬운 방법은 터미널에서 애초에 파일을 지정해서 여는 것
nano 파일이름
[커맨드] 텍스트 에디터 nano 사용법.

(3) 파일 편집 후 종료

파일 내용을 편집하고 난 후, 아래와 같이 ^X Ctrl + X를 누르면 다음과 같은 프롬프트가 등장

Save modified buffer (ANSWERIG "No" WILL DESTROY CHANGES) ?

아래의 단축키 안내에 따라 키보드의 Y 와 N를 눌러서 저장 여부를 결정

(4) 파일 저장

nano를 종료하지 않고, 파일을 저장할 수도 있다.
단축키 모음에 Save가 안 보이지만, ^O WriteOut을 이용. 해당 내용이 파일을 저장하는 단축키

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

2. 패키지와 패키지 매니저

(1) 패키지

  • 패키지는 여러 파일이 담겨있는 하나의 상자( ex) 윈도우의 '알집', '반디집' )
    리눅스의 패키지는 여러 파일을 모아 하나의 파일로 저장하고 있는 압축파일

패키지 구성 요소

  • 프로그램 파일
  • 프로그램 설치 파일
  • 프로그램 설치 설명서
  • 프로그램에 대한 정보를 담은 파일

(2) 패키지 매니저 ( npm 등 )

  • 패키지의 설치, 변경, 삭제 등 관리를 편리하게 해주는 도구( ex. 앱 스토어 )
    리눅스 운영체제의 사용자도 패키지 매니저를 이용해 필요한 패키지를 설치
  • 사용자가 패키지 매니저에게 특정 프로그램의 설치를 요청하면, 패키지 매니저는 패키지가 저장된 위치에서 패키지를 다운로드해 설치 프로그램을 실행
  • 패키지 매니저는 설치된 모든 프로그램의 업데이트를 확인하거나, 필요 없는 프로그램을 제거하는 데에도 사용

2-1. 패키지와 패키지 매니저 설치

(1) apt 명령어 이용하기

우분투는 기본적으로 apt라는 패키지 매니저가 내장

apt

ㅡ apt 패키지 매니저의 주요 명령어

  • 패키지 목록 갱신 : apt update(관리자 권한 필요. sudo)
    : 패키지를 다운로드 할 수 있는 여러 저장소의 최신 정보 업데이트
    새로운 저장소를 추가하거나, 패키지를 설치하기 전, 최신 정보를 갱신
    : 설치된 프로그램이 새로운 버전으로 변경되지 않습니다.
  • 업그레이드 가능한 패키지 목록을 출력: apt list -—upgradable
  • 전체 패키지 업그레이드(버전 업): apt upgrade (관리자 권한 필요)
  • 특정 패키지만 업그레이드(버전 업): apt --only-upgrade install 패키지 이름 (관리자 권한 필요)
  • 패키지 설치: apt install 패키지 이름 (관리자 권한 필요)
  • 설치된 패키지 보기: apt list --installed
  • 패키지 검색: apt search 검색어
  • 패키지 정보 확인: apt show 패키지 이름
  • 패키지 삭제: apt remove 패키지 이름(관리자 권한 필요)

(2) 관리자 권한 사용하기

  • 패키지 설치/삭제 등의 작업을 진행할 때 sudo 명령어를 이용해서 관리자 권한을 획득해야 한다

  • wget은 URL을 통해 파일을 다운로드하는 프로그램

wget이라는 패키지를 설치할 경우, 다음과 같이 입력
sudo apt install wget

Unix 기반 운영체제에서는 Ctrl + C 키는 작업을 취소하고, 터미널의 사용자 입력을 다시 되찾아오는 역할
ㅡ> 강제 종료

- 복사: (Ubuntu) Ctrl + Shift + c
- 붙여넣기: (Ubuntu) Ctrl + Shift + v

*ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

3. Node.js

  • 자바스크립트 런타임(runtime)중 하나
  • 런타임이란?
    프로그래밍 언어가 구동되는 환경, 즉 어떤 프로그램이 동작할 때, 프로그램이 동작하는 곳( 크롬, 사파리 )

3-1. nvm & node.js

  • nvm은 Node.js의 다양한 버전을 관리하는 프로그램(Node Version Manager)
    아래 명령어 전에 wget 설치하고 wget으로 명령어 입력해서 nvm 설치
nvm install --lts // 노드 js 설치
node -v // 버전 확인
nano helloWorld.js 

텍스트 에디터 nano를 이용해 새로운 파일을 생성, 컨트롤 x ㅡ y ㅡ 엔터로 저장

// helloWorld.js 파일을 node 환경에서 실행합니다.
node helloWorld.js

3-2. nvm 사용법

  • nvm은 여러 개의 Node.js 버전을 미리 설치해 두었다가 간단한 명령어를 통해 버전을 변경할 수 있습니다. 설치가 되어 있을 경우 Node.js의 버전을 변경하는 명령어는 nvm use 버전 넘버

3-3. npm & package.json

package.json 생성하기

먼저, 임의의 경로에 새로운 폴더 생성하고 폴더 내부로 이동

mkdir codestates
cd codestates

npm init  // 새로운 package.json 생성 명령어 차례대로 입력 후 enter 누름


ls
cat package.json // ls명령어와 cat 명령어로 확인하기

package.json

  • 남이 만들어놓은 모듈을 node.js 에서는 npm 모듈이라는 이름으로 부르며,
    이에 대한 정보를 담아둔 곳이 바로 package.json

    프로젝트(패키지) 전반에 관한 정보가 들어있다
  • 외부 라이브러리를 다운로드하기 위해 다양한 방법이 존재하지만, 그중 대표적인 것은 바로 npm
    npm은 Node Package Manager. 필요한 모듈을 다운로드할 수 있는, 모듈들이 모여있는 모듈 스토어
  • 리눅스의 패키지 매니저가 apt, macOS의 패키지 매니저가 brew이듯,
    node.js 생태계의 패키지 매니저는 npm.
    앞으로 필요한 모듈은 대부분 npm에서 다운로드해서 사용하면 된다.
  • 프로젝트에 관한 정보, CLI에서 사용가능한 명령, 개발과 관련된 dependency들
  • package.json에는 프로그램을 실행시키기 위해 필요한 모듈들이 무엇인지, 프로그램을 실행시키는 방법, 프로그램을 테스트하는 방법 등이 명시되어 있다.
    프로그램을 실행시키기 위해 필요한 실제 모듈은 따로 node_modules이라는 폴더에 저장
    package.json에는 어떤 모듈인지만 적혀 있음
  • package.json이 주는 또 하나의 이점은 프로젝트 코드를 전달할 때, 포함하고 있는 모든 모듈을 다 전달하지 않아도 된다는 점
    앞으로 스프린트를 진행할 때, 해당 스프린트의 레파지토리를 열어보면 node_modules 는 없고, package.json 만 있을텐데 package.json에서 필요하다고 하는 모듈을 npm을 이용해 다운로드하면 된다.
  • npm install 명령어를 입력하면, package.json에서 필요하다고 하는 모듈을 다운로드.
    npm install이 완료되면 node_modules 디렉토리가 생긴 걸 확인할 수 있다.

package.json 에 적혀있는 내용들

- devDependencies

개발이나 실행에 해당 모듈을 "의존"한다고 해서, "의존성(dependency)"이라고 부름
프로젝트를 개발하는 환경에서 필요한 모듈들이 무엇인지가 적혀 있다.
예를 들면 코드 모양을 잡아주는 lint나 테스팅 모듈처럼, 실제 프로젝트 동작에 직접적으로 영향을 주지 않는 모듈들을 명시

npm install을 이용하면, npm에 있는 모듈을 설치할 수 있는데, 이때 --save-dev 옵션과 함께 설치하면, 자동으로 devDependencies에 추가

$ npm install mocha --save-dev

--save-dev 옵션과 함께 install 실행시 자동으로 devDependencies에 추가됨

- dependencies

직접 실행과 관련 있는 dependency
devDependencies와는 다르게, 이 프로젝트가 돌아가기 위해 반드시 필요한 모듈들이 무엇인지가 적혀 있다.
예를 들어, underscore라든지, 이후 배울 React 같은 것이 좋은 예

$ npm install react
또는
$ npm install --save react

--save 옵션과 함께 (생략 가능) install 실행시 자동으로 dependencies에 추가됨

  • 내가 만든 프로그램을 나 혼자만 개발하고 사용한다면 큰 문제가 되지 않을 수 있지만, 우리는 대부분 다른 사람과 함께 개발하고 사용하게 된다.
    다른 사람에게 이 프로젝트에 대해 알려주기 위해 그 역할을 하는 것이 바로 package.json
  • 우리가 흔히 하는 npm install은 package.json에 있는 dependency (의존성 모듈)를 바탕으로 설치
  • dependency에 등록 X( dependency 정보를 적지 않았다고 가정 )
    코드에서는 해당 모듈을 쓰고 있지만 npm install로는 설치되지 않는다!
    무엇을 설치해야 이 프로그램이 작동되는지, 무엇을 설치해야 이 프로그램을 개발할 수 있을지 알 수 없다.

- scripts 항목

CLI에서 사용 가능한 명령을 기술 ( npm script 라고 부른다 )
CLI에서 실행할 때에는 "npm run <스크립트 이름>" 으로 실행

작업 내용과 실행 스크립트

  • node.js 앱 실행 ㅡ>npm run start
  • 테스트 실행 ㅡ> npm run test
  • 코드 검사 ㅡ> npm run lint
  • 과제 제출 (코드스테이츠 only) ㅡ> npm run submit

코드스테이츠에서 과제 제출 역시 npm script로 제공
대부분의 스프린트에서 npm run submit을 통해 과제 제출이 가능하다

기타

  • npm은 Node.js 생태계의 패키지 매니저 중 하나
  • 프로그램을 실행시키기 위해 필요한 실제 모듈은 package.json이 아닌 node_modules라는 폴더에 저장
  • 프로젝트 코드를 서로 주고 받을 때 모든 모듈을 전달하는 것이 아니라 package.json에 있는 정보를 전달.
    코드를 전달받은 사람은 package.json에 있는 정보에 따라 npm에서 직접 모듈을 다운받아 사용
profile
성장일지

0개의 댓글