[P1_S1] 실용적 유닉스 커맨드

보리·2024년 3월 12일
0

codeit-sprint

목록 보기
5/22

✨유닉스의 시작과 변형

  • 유닉스는 1970년대 초반, 미국 벨 연구소 직원 켄 톰슨과 데니스 리치의 주도로 개발되었다.
  • 개발자들이 소프트웨어를 개발하고 실행할 수 있는, 편리한 플랫폼을 제공하기 위해 개발되었다.
  • 사람이 이해하기 쉬운 고급 프로그래밍 언어, C로 대부분 작성되었기 때문에, 수정해서 다른 컴퓨터에 적용하기도 편했다. 유닉스를 변형할 수 있는 언어인 C언어도 덩달아 인기를 얻었다.
  • 변형에 제한을 두기 위해 POSIX라는 유닉스의 표준이 만들어지기도 했다.

✨무료와 공유의 문화, 리눅스의 등장

  • '자유 소프트웨어 재단 (Free Software Foundation)’이라는 곳에서, 유닉스의 코드를 하나도 사용하지 않고, 유닉스와 유사한 운영 체제를 직접 만들기 시작했다. 누구나 쉽게 사용하거나 변형할 수 있는, 무료 버전을 만들어서 배포하고자 함.
  • GNU
    • GNU는 "GNU's Not Unix”
    • 리누스 토발즈는 유닉스의 교육용 버전인 미닉스라는 운영 체제에서 아이디어를 얻어서 새로운 커널을 만들었고, 리눅스(Linux)라는 이름으로 공개했다.
    • GNU에 리눅스 커널을 합쳐서 만들었기 때문에, 이 운영 체제의 이름을 GNU/Linux라고 부름.
  • Ubuntu, Red hat, CentOS, Debian 이런 운영 체제들이 다 GNU/Linux를 변형해서 만들어진 것. 이런 것들을 '리눅스 배포판’이라고 부름.

macOS는?

  • BSD(Berkerly Software Distribution) 운영 체제. BSD는 리눅스보다도 더 이전에 탄생한 운영 체제다. 유닉스가 여러 곳에서 사용되고 있던 1978년, 미국 UC 버클리(Berkerly, BSD의 첫 글자) 대학의 대학원생이었던 빌 조이(Bill joy)와 척 핼리(Chuck Haley)는 기존의 유닉스를 개량하여 BSD라는 운영체제를 개발했다. 이 BSD는 계속 버전이 올라가면서 널리 쓰이기 시작했고 버전이 올라가서 4.3BSD까지도 개발이 되었다.
  • NeXT라는 컴퓨터 회사에서 이 4.3BSD를 기반으로 NeXTStep이라는 운영 체제를 개발했다. Apple에서는 이 NeXTStep을 Apple의 기기에 이식하기 위한 프로젝트를 시작했고, NeXTStep은 오늘날 Apple에 존재하는 다양한 운영 체제인 iOS, macOS, watchOS 등의 기초가 되었다.

→ 오늘날의 macOS는 Unix - BSD - NeXTStep - macOS 순의 역사를 거쳐 탄생한 것.

✨이 모든 운영 체제의 공통점

유닉스 표준에 부합해서 공식적으로 인증을 받으면 Unix-certified, 즉 공식 유닉스가 되고, 만약 이 표준을 인증받지 않았지만, 사용하기에 기능적으로 거의 차이가 없는 정도라면 Unix-like, 유사 유닉스라고 부른다.

https://bakey-api.codeit.kr/api/files/resource?root=static&seqId=4891&directory=unix-cert.png&name=unix-cert.png

✨터미널

터미널은 인풋을 받고, 아웃풋을 출력해 주는 프로그램

https://bakey-api.codeit.kr/api/files/resource?root=static&seqId=4896&directory=terminal.png&name=terminal.png

📘shell, bash 그리고 zsh

shell은 커맨드를 해석해 주는 프로그램

  • 컴퓨터는 datecal같은 단어를 이해하지 못한다. 그래서 이런 커맨드들을 컴퓨터가 이해할 수 있는 형태로 바꿔줘야 하는데, 그게 바로 shell이 하는 역할이다. shell이 date같은 커맨드를 컴퓨터가 이해할 수 있는 형태로 바꿔서 전달해 주면, 컴퓨터가 실제로 커맨드를 '실행'하고 결과를 되돌려 주는 것이다.
  • shell 종류
    • bash(Bourne again shell)
      • 가장 보편적이고, 많은 유닉스 운영 체제에서 기본 shell로 사용된다.
      • Ubuntu의 기본 shell
      • macOS는 10.15 Catalina 이전 버전에는 bash를 기본으로 썼었는데, 10.15 버전 이후부터는 zsh(Z shell)을 기본으로 쓰기 시작했다.

❓퀴즈

✔️command-line interface: 커맨드를 입력해서 컴퓨터를 사용하는 환경

✔️터미널: CLI 환경을 이용할 때, 인풋을 받고 아웃풋을 출력해주는 프로그램

✔️커맨드에는 아규먼트와 옵션을 줄 수 있다.

  • 아규먼트: 커맨드를 어느대상에 대해 실행할 것인지
  • 옵션: 커맨드를 어떻게 실행할 것인지

✨터미널 명령어

date: 날짜

cal: 달력

  • (특정 달력: cal 10 2021)
  • cal -j 10 2020: 1월1일부터 몇째날인지 나타냄.
  • -y: 연도에 대한 달력 출력
  • -yj (-j 2020 등 인자를 하나로 설정할 수도 있음.)

커맨드 매뉴얼: man

man [검색할 명령어] → 해당 명령어의 매뉴얼이 나옴.

⚠️파일이나 디렉토리 이름에 공백이 있을 때

  1. '' 사용

cd 'hello world'
  1. "" 사용

cd "hello world"
  1. \ 사용

cd hello\ world

이름에 여러 단어를 사용하고 싶을 때는 공백 대신 _같은 기호를 사용하는게 좋다.

Unix file types

/bin

  • bin은 'binaries'의 약자.
  • 컴퓨터가 실행할 수 있는 프로그램.

ls -l /bin

/bin 디렉토리의 내용을 살펴보면, ls 같은 파일들이 보인다. ls 커맨드를 입력하면 /bin 안에 있는 ls 프로그램이 실행된다.

/sbin

sbin은 bin과 비슷한데, 관리자 전용 프로그램들이 있다..

/etc

etc에는 컴퓨터 설정 파일들이 있다. 각종 프로그램의 설정 파일, 관리자 권한 설정 파일 같은 것들이 있다.

/home 또는 /Users

/home(리눅스) 또는 /Users(맥 OS) 디렉토리에는 사용자들의 홈 디렉토리가 있다. 사용자의 홈 디렉토리는 사용자의 모든 파일을 저장해 놓는 곳.

/usr

usr은 사용자(user)에게 필요한 파일들을 저장하고 있다. /usr 안에도 각종 binary(프로그램 파일)를 저장하고 있는 bin 디렉토리가 있다.

/bin에는 컴퓨터가 시작하거나 자신을 수리하기 위해서 꼭 필요한 커맨드들이 있고, /usr/bin에는 사용자가 필요한 커맨드들이 있다.

local이라는 디렉토리는 사용자가 직접 설치한 프로그램과 관련된 파일들이 있다.

Linux 루트 디렉토리 구성 - ECE - TUWLAB

Linux Root Folders Explained

❓퀴즈

✔️pwd: 유닉스에서 현재 경로를 알려줌

✔️~: 홈 디렉토리를 한자리 문자로 표현

✔️ls -l: 파일 종류, 파일 권한, 파일 소유자, 마지막 수정시간, 파일 사이즈 등 여러 추가 정보를 보여줌

✔️ls -a: ‘.’으로 시작하는 숨겨진 파일, 디렉토리를 보여줌.

⚠️실습오류

😓wls 설치 오류

가상머신을 통해 우분투 설치하기

😓가상머신에서 우분투 설치 오류

cpu를 2개로 설정하기

😓장치>게스트 확장 cd 이미지 삽입 무반응

[ VirtualBox ] 버츄얼 박스 우분투 VM에서 '게스트 확장 CD'가 실행되지 않을 때 확장기능 설치하는 방법

😓달력 명령어 cal 을 입력시 오류

which cal

cal 위치가 안나온다면

sudo apt update sudo apt install ncal

✨vim

📘vim 실행하기


vim

파일 경로를 아규먼트로 주면 해당하는 파일을 열거나, 존재하지 않으면 새로 만들어 주기.


vim path/to/file

📘vim의 4 가지 사용 모드

📘단축키 정리

  • 텍스트 입력: 입력 모드(i) → 텍스트 입력
  • 텍스트 한 줄 복사: 일반 모드 → 복사하고 싶은 줄에 커서 위치 → yy
  • 텍스트 한 줄 잘라내기: 일반 모드 → 잘라내고 싶은 줄에 커서 위치 → dd
  • 특정 영역 복사: 비주얼 모드(V는 줄 단위, v는 글자 단위) → 복사하고 싶은 영역 커서로 설정 → y
  • 특정 영역 잘라내기: 비주얼 모드(V는 줄 단위, v는 글자 단위) → 잘라내고 싶은 영역 커서로 설정 → d
  • 텍스트 붙여넣기: 일반 모드 → 붙여넣고 싶은 위치에 커서 위치 → p
  • 파일 저장: 명령 모드(:) → w + enter
  • 파일 저장 + vim 종료: 명령 모드(:) → wq + enter
  • vim 종료 (내용 저장되지 않음): 명령 모드(:) → q! + enter

📘 pwd (print working directory)

현재 디렉토리 (working directory)의 경로를 출력.

📘 cd(change directory)


cd [PATH]

cd dir1
  • PATH 경로에 해당하는 디렉토리로 이동.
  • 아무 아규먼트 없이 cd를 하면 사용자의 홈 디렉토리로 이동.
  • .을 사용하면 이전 경로로 돌아감.

cd path/to/foo    (foo 디렉토리로 이동)
cd path/to/bar    (bar 디렉토리로 이동)
cd -              (다시 foo 디렉토리로 이동)

📘 ls (list)


ls [-al] [PATH]

ls -al dir1
  • PATH에 해당하는 디렉토리 / 파일 정보를 보여줌.
  • PATH 아규먼트를 안 주면 현재 디렉토리 정보를 보여줌.
  • a 옵션: 숨겨진 파일을 포함한 모든 파일을 보여줌.
  • l 옵션: long format을 사용해서 더 자세한 정보를 보여줌.

📘mkdir (make directory)


mkdir PATH1 PATH2 ...

mkdir dir2
  • 디렉토리를 생성.
  • 여러 경로를 한꺼번에 줘서 여러 디렉토리를 한꺼번에 만들 수도 있다.

📘touch (touch file)


touch PATH1 PATH2 ...

touch file1.txt
  • 경로에 해당하는 파일을 생성.
  • (원래는 파일의 마지막 접근 시간 / 수정 시간을 업데이트하는데 쓰이지만 파일이 존재하지 않으면 새로 생성하기 때문에 파일 생성 용도로도 쓰임.)

📘vim


vim [PATH]

vim file1.txt
  • vim 텍스트 에디터를 실행.

📘cat (concatenate)


cat PATH1 PATH2 ...

cat file1.txt
  • 경로에 해당하는 파일들의 내용을 출력.
  • 파일이 여러 개인 경우 내용을 모두 붙여서 출력.

📘less


less PATH

less file1.txt
  • PATH에 해당하는 파일을 페이지 단위로 나눠서 보여줌.

단축키:

  • 줄 이동: 위쪽 / 아래쪽 방향키
  • 다음 페이지: space 아니면 f
  • 이전 페이지: b
  • 마지막 페이지: G
  • 처음 페이지: g

head [-n count] PATH

head -n 5 file1.txt
  • PATH에 해당하는 파일의 처음 10줄을 출력.
  • n 옵션: 출력되는 줄 개수를 바꿈.

📘tail


tail [-n count] PATH

tail -n 5 file1.txt
  • PATH에 해당하는 파일의 마지막 10줄을 출력.
  • n 옵션: 출력되는 줄 개수를 바꿈.

📘mv (move)


mv [-i] SOURCE_PATH DEST_PATH

mv -i file1.txt file2.txt

mv -i file1.txt dir1
  • 디렉토리/파일을 이동하거나 이름을 변경.
  • 두 번째 아규먼트(DEST_PATH) 가 이미 존재하는 디렉토리의 경로일 경우 SOURCE_PATH에 해당하는 디렉토리/파일을 그 안으로 이동하고, 그렇지 않으면 DEST_PATH로 이름 변경.
  • i 옵션: 이동/이름 변경을 할 때 똑같은 이름의 디렉토리/파일이 있으면 덮어씌워짐. 확인을 하면서 mv를 하려면 i 옵션을 사용하면 됨.

📘cp (copy)


cp [-ri] SOURCE_PATH DEST_PATH

cp -i file1.txt file2.txt

cp -ri dir1 dir2
  • 디렉토리/파일을 복사.
  • 두 번째 아규먼트(DEST_PATH) 가 이미 존재하는 디렉토리의 경로일 경우 SOURCE_PATH에 해당하는 디렉토리/파일을 그 안으로 복사하고, 그렇지 않으면 DEST_PATH라는 이름으로 복사.
  • r 옵션: 디렉토리를 복사할 때는 꼭 r 옵션을 써야 한다.
  • i 옵션: 복사할 때 똑같은 이름의 파일이 있으면 덮어씌워진다. 확인을 하면서 cp를 하려면 i 옵션을 사용하면 됨.

📘rm (remove)


rm [-rif] PATH1 PATH2 ...

rm file1.txt file2.txt

rm -rf dir1
  • 경로에 해당하는 파일/디렉토리들을 지워줌.
  • r 옵션: 디렉토리를 삭제할 때는 꼭 r 옵션을 써야 함.
  • i 옵션: 삭제할 때 각 파일을 정말 지울 것인지 물어봄.
  • f 옵션: 지울 것인지 절대 확인하지 않고 바로 지움.

✔️외부 프로그램을 설치하는 방법

우분투 - apt

맥os - homebrew

✔️sudo

  • 유닉스 운영 체제에서 특정 작업을 하려면 관리자 권한이 필요할 때가 있다. 특히 설치 관련 작업을 할 때 필요한 경우가 많다. 우리가 보통 컴퓨터에서 사용하는 계정은 일반 계정이기 때문에 관리자 권한이 없다. 그래서 관리자 권한이 필요한 커맨드를 실행하려고 하면 권한 오류(permission denied)가 난다.
  • 잠시 관리자 권한을 획득할 수는 있다. → sudo 커맨드

sudo command

sudo 뒤에 command를 쓰면, 관리자 권한을 가지고 command가 실행된다. 그러면 권한 문제없이 command를 실행할 수 있다.


sudo ls /path/to/file

sudo cat /path/to/file

sudo apt install mc  # Ubuntu 예시

✔️WSL로 윈도우에 있는 파일 접근하기

윈도우 파일은 /mnt/c 경로에 있다. /mnt/c 가 윈도우의 C: 드라이브다.

✔️윈도우 PowerShell

PowerShell: 윈도우 전용 커맨드라인 툴

  • 시스템 관리, 자동화, 개발 등, 기본 유닉스 커맨드 지원

PowerShell vs cmd(명령 프롬프트)

cmd(명령 프롬프트/Command Prompt): 윈도우 전용 커맨드라인 툴.

  • PowerShell에 비해 기능이 적고 cmd에서 할 수 있는 모든 건 PowerShell에서도 할 수 있다.
  • 간단한 작업을 할 때는 cmd를 써도 되지만, PowerShell이 더 복잡한 것도 아니니까 그냥 PowerShell을 쓰는게 무방하다.
  • PowerShell 도움말 업데이트
Update-Help

PowerShell과 유닉스 커맨드

PowerShell에서는 아래 유닉스 커맨드를 사용할 수 있다:

  • man
  • pwd
  • cd
  • ls
  • mkdir
  • cat
  • mv
  • rm
  • cp
  • date
  • clear

Linux commands that work in Powershell by default.

PowerShell에서는 기본적으로 cmdlet이라고 하는 커맨드들을 사용한다.

Action-Object  
  • 하고 싶은 동작과 대상 사이에 - 를 넣기.
  • PowerShell에 ls같은 걸 입력하면 lsGet-ChildItem이라는 cmdlet을 가리키고 있기 때문에 ls를 사용할 수 있다 (이럴 때 lsGet-ChildItemalias(에일리어스)라고 함).
  • 하지만 결국 유닉스의 ls가 아닌 Get-ChildItem이 호출되는 것이기 때문에 옵션을 주는 방법과 커맨드의 동작은 조금 다를 수 있다.

📘실제 유닉스 커맨드와 차이점

경로

윈도우에서는 경로를 표시할 때 \(한국 키보드는 )를 사용함. PowerShell에서 /를 입력해도 되지만 프롬프트에 경로를 표시할 때나 자동완성을 활용할 경우 \가 사용됨.

옵션

cmdlet 옵션은 한 글자가 아닌 전체 단어다 (예: -Recurse). 유닉스 커맨드처럼 한 글자(예: -r)로 줄여 쓸 수 있는 옵션들도 있지만 그럴 수 없는 옵션들도 많고, 일일이 외워야 하기 때문에 PowerShell 옵션을 그대로 사용하는 것이 좋다.

man

man 커맨드를 실행하면 aliasing 하고 있는 cmdlet에 대한 도움말을 보여준다.

man ls

더 자세한 정보를 보고 싶다면 -Full 옵션


man -Full ls

ls

PowerShell에서 ls를 하면 파일/폴더 이름뿐만이 아닌 다양한 정보가 나온다. .으로 시작하는 파일들도 보임.

유닉스의 ls -al과 비슷

touch

PowerShell에 touch라는 alias는 없다. 그래서 파일을 생성할 때는 다른 방법을 사용해야 함.


$null > filename

filename 이름을 가진 빈 파일이 생성된다.

cat

PowerShell의 cat은 아규먼트를 하나만 받는다. 여러 파일을 아규먼트로 주면 오류가 남.


cat testfile.txt testfile2.txt # 오류

mv

bash/zsh에서 mv를 했을 때 목적지에 똑같은 이름의 파일/폴더가 있으면 그걸 덮어쓴다. 하지만 PowerShell에서는 파일이 이미 존재한다는 오류가 난다.


mv testfile.txt testfile2.txt # 오류

만약 파일을 덮어쓰고 싶다면 -Force 옵션.


mv -Force testfile.txt testfile2.txt

cp

mv와 마찬가지로 PowerShell에서는 파일/폴더를 덮어쓰지 않고 오류가 난다. -Force 옵션을 사용하면 파일/폴더를 덮어쓸 수 있다.

그리고 폴더를 복사할 때는 -Recurse 옵션을 사용해야 한다.


cp -Recurse foo bar

rm

폴더를 삭제할 때는 -Recurse 옵션

✨IDE(통합 개발 환경)와 PowerShell

VSCode의 터미널

PyCharm의 터미널

profile
정신차려 이 각박한 세상속에서

0개의 댓글