S1_U7_CH1. Command-Line Interface

Judevv·2023년 5월 1일
0

Chapter 1. Command-Line Interface

학습 목표

  • 리눅스 터미널을 실행할 수 있다.
  • CLI를 이용한 작업과 GUI를 이용한 작업이 동일함을 이해할 수 있다.
  • 리눅스 터미널에서 기본적인 명령어를 사용할 수 있다.
  • 명령어를 사용할 때, 등장하는 키워드에 대해 이해할 수 있다.
  • 관리자 권한을 이해할 수 있다.
  • 절대 경로와 상대 경로의 차이를 이해할 수 있다.
  • 텍스트 에디터 nano를 이용해 파일을 수정하고, 저장할 수 있다.

1-1. CLI 명령어(1)

기본적인 명령어(1)

터미널 실행하기

  • macOS 기준
    • 런치패드(Launchpad)를 이용해 터미널을 실행하는 방법
      • 하단의 독(dock, 설정에 따라 화면의 모서리 중 다른 곳에 위치할 수 있음)에서 런치패드를 클릭
      • 런치패드가 열리면, 상단의 검색창에 Terminal을 입력하고 Enter(엔터 키)를 누르거나, 화면에 나타난 프로그램을 클릭
    • 스포트라이트(Spotlight search)를 이용해 터미널을 실행하는 방법
      • 모니터 화면 최상단의 상태 바에서 돋보기 모양을 클릭하여 스포트라이트를 실행
        • 단축키: command(커맨드 키, ⌘) + Space(스페이스 키)
      • Terminal을 입력하고 Enter(엔터 키)를 누르거나, 화면에 나타난 프로그램을 클릭

프롬프트(Prompt)

  • 터미널은 CLI(Command-Line Interface)
    • 입력하는 글자와 출력되는 글자로 컴퓨터와 소통
  • 키보드의 입력을 확인하고 편집할 수 있는 한 줄의 공간을 프롬프트(Prompt)라고 합니다.

여러분은 이번 유닛을 진행하는 동안, 프롬프트에 명령어를 계속해서 입력합니다. 입력한 명령어를 실행하려면, Enter(엔터 키)를 누르면 됩니다. 바로 이어지는 명령어부터 직접 입력하며 학습해 보세요.

pwd : 현재 위치 확인

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

  • CLI인 터미널에서는 간단하게 pwd를 프롬프트에 입력하고, Enter(엔터 키)를 누르면 현재 경로가 나타남

pwd

터미널의 프롬프트에 pwd를 입력하고 Enter(엔터 키)를 누르면 현재 위치를 확인할 수 있음

  • pwd는 print working directory의 약자

    • 디렉토리(directory)는 폴더
  • CLI에서 폴더를 열거나 닫으면서 이동하면, 현재 위치가 헷갈릴 수 있음

    • 이때 명령어 pwd를 입력하고 Enter(엔터 키)를 누르면, 컴퓨터는 현재 작업 중인 폴더의 위치를 출력

mkdir : 새로운 폴더 생성

  • mkdir은 make directories의 약자
  • 폴더를 만들라는 명령을 컴퓨터에 전달
  • 명령어 mkdir은 생성할 폴더의 이름을 함께 입력
mkdir helloWorld
  • 별다른 출력 없이 폴더가 생성

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

  • ls는 list의 약자
  • 특정 폴더에 포함된 파일이나 하위 폴더의 리스트를 출력
ls
  • 자주 사용하는 옵션 l과 a가 있음
  • CLI에서 특정 명령어의 옵션을 사용하는 경우에는 -를 이용해 옵션을 입력했다고 컴퓨터에 전달
ls -l
ls -a
ls -al 또는 ls -la
  • 위의 세 번째 예시에서, 옵션을 뜻하는 대시(dash, -) 뒤에 오는 옵션의 순서는 기능에 영향을 미치지 않음
  • a는 "all"이라는 의미
    • 숨어있는 폴더나 파일을 포함한 모든 항목을 터미널에 출력
  • l은 폴더나 파일의 포맷을 전부 표현하라는 의미
    • 하나의 파일 또는 하나의 폴더는 한 줄에 출력
# '#' 기호는 설명을 위해 사용되었습니다.
drwxr-xr-x   # 생략
-rw-r--r--   # 생략
  • 명령어 ls와 함께 옵션 l을 사용하면, 가장 왼쪽에 출력되는 두 글자 d와 -를 확인
  • d로 출력된 경우는 폴더를, -로 출력된 경우는 파일을 - 폴더는 다음 명령어 cd를 통해 진입할 수 있지만, 파일이라면 진입할 수 없음

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

  • 터미널의 현재 위치를 GUI의 탐색기(파인더)로 열 수 있습니다.

    • macOS 기준
open .

cd: 폴더에 진입하기

  • cd는 change directory의 약자
    • 프롬프트로 상호작용하는 폴더를 다른 폴더로 변경한다는 의미
# '#' 기호는 설명을 위해 사용되었습니다.
# pwd를 이용해 현재 위치를 확인합니다.
pwd
# [사용자명]은 처음 OS를 설치할 때 입력한 사용자 이름입니다.
# (Ubuntu) /home/[사용자명]
# (macOS) /Users/[사용자명]

# ls를 이용해 현재 위치의 모든 폴더와 파일을 확인합니다.
ls
# cd를 이용해 폴더 helloWorld로 진입합니다.
cd helloWorld
# pwd를 이용해 현재 위치를 확인합니다.
pwd

touch: 파일 생성하기

  • 파일을 만들기 위해 touch라는 명령어를 사용
touch hi.txt

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

명령어 touch로 만든 파일 "hi.txt"를 GUI의 탐색기로 확인할 수 있음

  • 마우스를 이용해 탐색기 내의 파일 "hi.txt"를 실행하고, 텍스트 편집기에 키보드를 이용해 지메일 주소를 입력

  • 이메일 입력을 마쳤다면, 저장하고 텍스트 편집기를 종료

cat: 파일의 내용을 터미널에 출력하기

  • 텍스트 편집기로 작성한 이메일을 CLI에서 확인
  • 명령어 cat으로 GUI를 이용해 작성한 내용을 확인
cat hi.txt
  • 명령어 cat은 파일의 내용을 터미널에 출력하는 명령어

  • CLI(Command-Line Interface)는 텍스트를 기반으로 소통하기 때문에, GUI를 이용한 편집기가 실행되지 않음

1-2. CLI 명령어(2)

기본적인 명령어(2)

시작하기 전 준비하기

  • 폴더와 파일의 이름을 바꾸고, 위치를 이동시키고, 삭제하는 내용을 다루기 때문에 사용할 폴더나 파일을 조금 추가
# '#' 기호는 설명을 위해 사용하였습니다.
mkdir hello
cd hello # 폴더 hello로 진입합니다.
pwd # 현재 위치를 확인합니다.
mkdir bye
touch bye.txt
ls # 폴더와 파일을 출력합니다.
* 현재 위치는 하위 폴더 "hello"

rm: 폴더나 파일 삭제하기

  • rm은 폴더나 파일을 삭제할 때 사용
  • 변경 사항을 확인하기 위해서는, 명령어 ls를 자주 입력하면 도움이 됨
ls
# bye bye.txt 가 출력됩니다.
  • 명령어 rm으로 파일을 삭제
  • 명령어 rm의 뜻은 remove(삭제하다)
    • 명령어 rm으로 삭제한 폴더나 파일은, 휴지통을 거치지 않고 삭제
rm bye.txt
ls
# bye 폴더만 출력됩니다.
  • 명령어 rm으로 파일을 지운 뒤 명령어 ls를 입력하면, 폴더 "bye"만 출력됩
  • 남아있는 폴더 "bye"도 삭제
rm bye
# rm: bye: is a directory
ls
# bye
  • 명령어 rm은 단일 파일을 삭제 가능
  • 폴더를 삭제하려면 옵션을 이용
    • 대시(-)를 사용하여 옵션을 입력
    • 사용할 수 있는 옵션은 r과 f
rm -rf bye
ls # 아무것도 출력되지 않습니다.
* 옵션 r은 "recursive"를 뜻하고, 옵션 f는 "force"를 뜻함
옵션 r은 폴더를 지울 때 사용하고, 옵션 f는 질문을 받지 않고 지울 때 사용

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

  • 명령어 mv는 move의 약자로, 폴더나 파일을 이동할 때 사용
  • CLI에서는 명령어 mv로 폴더나 파일을 다른 폴더로 옮길 수 있음
  • 명령어를 연습해 보기 위해, 명령어 rm으로 삭제한 폴더 "bye"와 파일 "bye.txt"를 다시 생성
# '#' 기호는 설명을 위해 사용하였습니다.
mkdir bye # bye 폴더를 생성합니다.
touch bye.txt # bye.txt 파일을 생성합니다.

명령어 mv를 통해 파일 "bye.txt"를 폴더 "bye"로 옮김

# '#' 기호는 설명을 위해 사용하였습니다.
mv bye.txt bye/
ls
# bye 폴더만 출력됩니다.
  • 명령어 mv 뒤에는 순서대로 [폴더나 파일의 이름][도착 폴더의 이름]를 입력
# '#' 기호는 설명을 위해 사용하였습니다.
cd bye
ls
# bye.txt 파일이 출력됩니다.
  • 명령어 mv를 이용하면, 폴더나 파일의 이름을 변경 가능
  • 명령어 mv를 사용하기 위해 필요한 [폴더나 파일의 이름]에는, 변경할 폴더나 파일의 이름을 입력
  • [도착 폴더의 이름]을 대신해, 변경하고자 하는 파일의 이름을 입력
  • 폴더 "bye"에 있는 파일 "bye.txt"의 이름을 "helloWorld.txt"로 변경
# '#' 기호는 설명을 위해 사용하였습니다.
ls # 현재 폴더에 있는 폴더나 파일을 출력합니다.
# bye.txt 파일이 출력됩니다.
mv bye.txt helloWorld.txt
ls
# helloWorld.txt 파일이 출력됩니다.

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

  • 컴퓨터는 옮기려고 하는 폴더나 파일을 잠시 저장해 두고 원래 위치에 있는 폴더나 파일을 삭제함

  • 그다음, 이동하려는 도착 폴더에 저장해 둔 내용으로 새로운 파일을 생성

  • 만약 명령어 mv에 입력하는 폴더나 파일의 원래 위치와 도착 폴더의 위치가 같은 경우에도 폴더나 파일을 삭제하고 다시 만들까?

    • 폴더나 파일의 이름의 내용과 위치가 같고, 이름만 다른 경우에 새로운 파일을 생성하는 일은 분명 비효율적
    • 그래서 컴퓨터는 폴더나 파일을 삭제하고 새롭게 작성하는 대신, 폴더나 파일의 이름만 변경

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

  • 현재 위치는 ~/helloWorld/hello/bye/
    명령어 pwd로 확인하면, 물결 표시(~)를 대신해 운영체제에 따라 /home/[username](Ubuntu) 또는 /Users/[username](macOS)가 출력

  • 명령어 pwd를 입력하면, /home/[username]/helloWorld/hello/bye/(Ubuntu) 또는 /Users/[username]/helloWorld/hello/bye/(macOS)가 출력

  • 명령어 cp는 copy의 약자로, 폴더나 파일을 복사할 때 사용
# '#' 기호는 설명을 위해 사용하였습니다.
ls
# helloWorld.txt 가 출력됩니다.
cp helloWorld.txt hiComputer.txt
ls
# helloWorld.txt hiComputer.txt 가 출력됩니다.
# '#' 기호는 설명을 위해 사용하였습니다.
cd ..
ls
# bye가 출력됩니다.
pwd
# (Ubuntu) /home/[username]/helloWorld/hello
# (macOS) /home/[username]/helloWorld/hello
  • CLI에서 .은 현재 폴더를 나타냄
    ..은 현재 폴더(.)를 기준으로, 앞에 .이 하나 더 붙음
    이렇게 만들어진 ..은 현재 폴더보다 앞에 있는 폴더를 가리킴
  • 폴더를 복사를 위해 명령어 cp를 그냥 사용하면, 명령어 rm으로 폴더를 삭제할 때처럼 메시지가 출력
  • 명령어 cp에 사용하는 옵션은, 명령어 rm에 사용하는 옵션과 동일
# '#' 기호는 설명을 위해 사용하였습니다.
cp -rf bye hi
ls
# bye hi 가 출력됩니다.
  • 각 명령어에 포함된 옵션은 명령어 이름만 입력하거나 -h 또는 --help와 같은 옵션을 통해 확인할 수 있음

1-3. 관리자 권한과 경로

사용자와 관리자

  • 사용자는 PC를 켜서 바탕화면에 진입하기 위해 로그인 하는 계정이며, 프로그램을 실행하지만, 설치/변경/삭제는 제한된 권한을 가지고 있음
  • 관리자는 프로그램 설치, 변경, 삭제 등을 할 수 있는 권한을 가지고 있으며, 시스템을 관리함
  • UAC(User Account Control, 사용자 계정 컨트롤)로 사용자를 악성코드와 프로그램 충돌에서 보호하기 위해 관리자 권한을 부여함

절대경로와 상대경로

  • 절대경로

    • 절대 경로는 기준점으로부터의 절대적인 위치
    • 이 기준점을 루트 폴더(/)라고 함
    • 절대 경로는 특정 폴더나 파일이 루트 폴더로부터 어떤 폴더로 진입하는 경우 만날 수 있는지 나타냄
  • 상대경로

    • 특정 폴더 또는 파일의 위치를 현재 위치를 기준점으로 나타냄
    • 현재 위치한 폴더는 점(.)으로 표현하고, 상위 폴더는 두 개의 점(..)으로 표현
    • 현재 경로(/Users/[username]/helloWorld/hello/)에 포함된 폴더나 파일을 확인하기 위해, 명령어 ls를 사용
    • 명령어 ls를 통해 확인되는 폴더나 파일은, 상대 경로로써 ./을 붙여 표현
    • 만약 현재 폴더 아래의 폴더 hi로 진입하려고 한다면, 명령어 cd를 이용할 수 있음
    • 점(.)은 현재 폴더를, 슬래시(/)는 폴더 내부를 나타냄
    • ./는 "현재 폴더 아래의"라는 뜻
# '#' 기호는 설명을 위해 사용하였습니다.
cd ./hi # 현재 폴더 아래의 hi 폴더로 진입하는 명령
pwd
# (Ubuntu) /home/[username]/helloWorld/hello/hi
# (macOS) /Users/[username]/helloWorld/hello/hi
ls
# helloWorld.txt hiComputer.txt
  • 부분의 CLI 명령어는 경로를 인식
  • 현재 폴더 아래에 있는 파일 helloWorld.txt를 폴더 helloWorld로 이동하려면
# '#' 기호는 설명을 위해 사용하였습니다.
mv helloWorld.txt ../../
ls
# hiComputer.txt
cd ../../
pwd
# (Ubuntu) /home/[username]/helloWorld/
# (macOS) /Users/[username]/helloWorld/
ls
# hello helloWorld.txt hi.txt

관리자(root) 권한

  • 관리자 영역을 실수로 변경하면, 운영체제(Operating System)가 먹통이 될 수 있음!!!!!

  • 운영체제가 망가지면, 운영체제를 재설치해야 할 수 있음니다.

  • 절대 경로의 기준점인 루트 폴더(/)는 Linux의 관리자 영역

  • 일반 사용자의 권한으로는 어떤 폴더나 파일도 생성, 변경, 삭제할 수 없음

  • Linux 관리자의 가장 큰 특징은, 어떤 일이 있더라도 일반 사용자에게 관리자 권한(루트 권한)을 완전하게 넘기지 않는 것 (그래서 루팅한다... 라는 말이 생겼나?)

  • 사용자가 관리자 권한이 있어야 하는 경우는 새로운 프로그램을 설치하거나, 프로그램을 변경 또는 삭제하는 경우이기 때문에, 해당 프로그램을 설치, 변경 또는 삭제할 수 있는 관리자 권한만 전달

  • 사용자와 관리자를 명확히 분리하여 사용자의 실수로 발생할 수 있는 시스템 에러로부터 운영체제를 보호

  • 루트폴더로 이동하여 명령어 mkdir을 이용해 폴더 test를 생성하면, "Read-only file system"이라는 에러가 뜸

  • 읽기 전용(Read-only)이라는 말은, 폴더나 파일을 생성, 변경 또는 삭제할 수 없다는 의미

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

  • 현재 로그인된 사용자를 확인하는 명령어

# '#' 기호는 설명을 위해 사용하였습니다.
whoami
# [username]
  • 명령어 whoami를 통해 확인할 수 있는 사용자는, 폴더의 형태로 존재

  • 사용자 권한은 username 폴더 내에서만 자유롭게 사용할 수 있으며, 윈도우에서 사용자 계정 컨트롤을 이용해 사용자를 나누는 것과 마찬가지로, username에 맞게 폴더를 생성하여 해당 폴더 내에서 권한을 사용하도록 제한

  • 관리자 권한으로 변경한 내용은, 사용자 권한으로 해결할 수 없음

    	* 사용자 폴더의 경로(Path)는 ~/로 표시됩니다. 물결 기호(~)는 루트폴더(/)로부터 사용자 폴더(username)까지의 경로를 축약한 형태
  • 사용자가 새로운 프로그램을 설치하거나 변경 또는 삭제할 때에는, 관리자 권한이 필요

    • 사용자가 관리자 권한을 필요로 할 때, 사용자 권한을 이용할 수 있는 명령어 sudo!!!

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

  • 명령어 sudo는 사용자 환경에서, 관리자 권한을 획득하는 명령어
# '#' 기호는 설명을 위해 사용하였습니다.
pwd
# (Ubuntu) /home/[username]/helloWorld/
# (macOS) /Users/[username]/helloWorld/
  • 관리자 권한을 획득하여 폴더를 만들고, 소유자를 비교
    • 명령어 mkdir을 이용해 폴더 두 개를 생성
      • 하나는 mkdir만 사용하고, 다른 하나의 폴더는 명령어 mkdir 앞에 명령어 sudo를 추가해 폴더를 생성
      • 명령어 sudo는 기본적인 CLI 명령어의 앞에 작성하여, 관리자 권한을 일시적으로 획득하는 명령어
      • 명령어 sudo는 한시적으로나마 관리자 권한을 가지기 때문에 항상 비밀번호와 함께 사용
      • 처음 리눅스 계정을 생성할 때 입력한 사용자의 비밀번호를 입력
      • 비밀번호는 화면에 출력되지 않지만, 터미널에 정상적으로 입력
# '#' 기호는 설명을 위해 사용하였습니다.
mkdir justMkdir
sudo mkdir sudoMkdir
password: # 타이핑을 해도 출력이 없습니다. 비밀번호가 출력되지 않더라도, 입력이 정상적으로 이뤄지고 있습니다.
ls
# justMkdir sudoMkdir helloWorld.txt hi.txt
  • 명령어 sudo를 이용해 생성한 폴더의 소유자는 루트
    • 사용자 권한이 아니라, 관리자 권한으로 생성되었다는 뜻
    • 반면에, 명령어 sudo를 사용하지 않은 폴더 justMkdir은 사용자 소유의 폴더
    • 명령어 ls -l을 이용해 차이점을 확인

1-4. 텍스트 에디터 nano

왜 터미널에서 에디터를 사용해야 하나요? 이미 Visual Studio Code와 같은 멋진 GUI 에디터가 있지 않나요?

  • AWS(Amazon Web Service)와 같은 원격 서버 환경에서 원격으로 텍스트 파일을 편집해야 하는 경우가 있음
  • CLI는 앞으로도 계속 유용할 것이므로, 터미널에서 자유자재로 다룰 수 있는 에디터가 필요

nano 실행

  • GUI 에디터인 VScode를 역시 아래와 같이 CLI에서 실행
code hello.js  # hello.js 를 VScode에서 엽니다.
  • 터미널을 열어, nano를 실행합니다.
nano hello.js  # hello.js 를 nano에서 엽니다.
nano # 그냥 실행할 수도 있습니다.

nano 화면 살펴보기

다음은 적당한 파일을 nano 에디터를 이용해 연 화면입니다.

CLI에서 사용하는 텍스트 에디터 nano의 실행화면

텍스트 에디터 nano의 구성요소

(A) 파일 이름 안내
(B) 파일 편집 화면, 실제로 여기서 텍스트 파일을 편집
(C) 사용에 필요한 각종 단축키
화면에 표시된 ^X와 같은 내용은 Ctrl + X 키 조합을 의미

파일 열기

  • 파일을 열기 위해서는 단축키 화면에 표시된 것처럼 ^R, 즉 Ctrl + R 키 조합을 의미

  • 기본적으로 파일 이름을 입력하도록 화면이 안내되어 있지만, 즉시 ^T Ctrl + T를 누른 후 화살표 키를 이용해 파일 및 디렉토리를 탐색한 후 불러올 수 있음

  • 가장 쉬운 방법은 터미널에서 애초에 파일을 지정해서 여는 것

nano 파일이름

파일 편집 후 종료

  • 파일에 변경사항이 존재하면, 종료 시에 저장할지를 물어봄

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

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

텍스트 에디터 nano의 화면에 메시지가 나타나는 영역

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

파일 저장

  • nano를 종료하지 않고, 파일을 저장할 수도 있음
  • 단축키 모음에 Save가 안 보이지만, ^O WriteOut을 이용
profile
감성있는 개발자를 꿈꿔요

0개의 댓글