리눅스 쉘(shell, sh)의 정의와 종류, 명령어 모음

민준·2025년 1월 28일
post-thumbnail

리눅스 쉘(shell, sh)이란 무엇인가?

  • 리눅스 쉘은 사용자가 운영체제와 상호작용할 수 있게 해주는 명령어 기반 인터페이스
  • 쉘은 사용자가 입력한 명령을 해석하고, 이를 실행하는 역할을 하며, 스크립트를 작성해 자동화를 구현할수도 있음.

리눅스 쉘의 종류

1. sh (Bourne Shell) → 과거에 많이 사용

  • AT&T 벨 연구소의 스티븐 본 개발
  • 가장 기본적인 쉘이며, 많은 유닉스 시스템의 표준 쉘.
  • 비교적 간단한 기능만 제공.

2. bash (Bourne Again Shell)

  • GNU 프로젝트 일환 개발, 유닉스 계열 운영체제 기본 쉘
  • sh의 확장판으로, 리눅스 배포판에서 기본적으로 제공되는 쉘.
  • 스크립트 작성과 명령 실행에 강력한 기능 제공.
  • 명령어 자동완성, 히스토리 기능 등 추가 지원.

3. zsh (Z Shell) → 필자가 사용

  • bash의 기능을 확장한 고급 쉘.
  • 높은 커스터마이징 가능성과 플러그인 시스템 제공
  • 자동완성, 문법 하이라이트, 디렉토리 점프 등이 뛰어남.

    쉘을 시작할때, 터미널을 껐다키거나, source ~/.bashrc 통해 설정 재로딩이 가능

    • 공통: ~/.zshrc (rc : runcommands)
    • 계정: ~/.zprofile 또는 ~/.zshenv
    • (기타) 히스토리 저장: ~/.zsh_history
    • (기타) 세션 관리: ~/.zsh_sessions
    • 쉘을 수행할 때: 스크립트 앞에 #!/bin/zsh

4. ksh(Korn Shell)

  • sh 기반으로 개발된 쉘.
  • 프로그래밍 기능이 강력하며, 스크립트 작성에 적합

5. fish (Friendly Interactive Shell)

  • 사용자 친화적인 현대적 쉘.
  • 별도의 설정 없이도 유용한 기본 기능 제공.
  • 색상 강조, 자동 제안 등이 기본적으로 활성화됨.

6. csh/tcsh

  • C 언어 스타일의 문법을 가진 쉘.
  • tcsh는 csh를 확장한 버전

리눅스 쉘(Bash/Zsh) 명령어 모음

1. 디렉토리 및 파일 여행

  • pwd : 현재 디렉토리의 절대경로
  • ls : 디렉토리 내 어떤 파일들이 있는지 조회|ls -al 혹은 ll = ls- l (a 모든걸, l 상세하게)
  • cd : 디렉토리 이동 (들어가거나, 나올때)|이전 디렉토리 cd .. 상대경로 cd ./x 절대경로 cd /x

2. 디렉토리 및 파일 조작 (생성, 이동, 삭제)

  • mkdir : 새 디렉토리 생성
  • rm : 디렉토리 혹은 파일 삭제 | rm -rf (r 리컬시브, 내부에 있는 디렉토리들 모두, f 강제로 삭제)
  • cp : 디렉토리 혹은 파일 복사 | cp 혹은 cp -r (r 리컬시브, 내부에 있는 디렉토리들 모두)
  • mv : 디렉토리 혹은 파일 이동 혹은 명칭 변경
  • touch : 아무것도 없는 빈 파일 생성

3. 파일 출력

  • cat : 파일 출력
  • echo : 문자열 출력, 일반적으로 환경변수 값을 확인하는데에 사용 | echo $ZSH_CUSTOM
    • 단발적 환경변수 설정 : export ZSH_CUSTOM="Hello, World" (영구 설정은 .zshrc 내 할 것)
  • head : 파일 첫 라인 출력 | head -n 10 제외 가능 head -10
  • tail : 파일 끝 라인 출력 | tail -n 10 혹은 실시간 로그 조회 시 tail -f -n 10 (10번째부터)
    • Apache 웹서버 로그 : tail -f /var/log/apache2/access.log
    • Nginx 웹서버 로그 : tail -f /var/log/nginx/access.log
    • Tomcat 웹서버 로그 : tail -f /var/log/tomcat/access.log / catalina.out

4. 명령어 확장

명령어 확장은 리눅스 쉘에서 여러 명령어를 조합하거나, 명령어의 출력을 조작하고 전달하는 방식, 이를 통해 단순한 명령어 실행을 넘어 다양한 작업을 효율적으로 처리가 가능함.

4.1. 명령어 확장 : | (파이프 Pipe) → 연결되어 이어 수행

  • 개념:

    • 파이프(|)는 한 명령어의 출력을 다음 명령어의 입력으로 전달
    • 여러 프로세스를 연결해 데이터 프름을 처리하는 방식
  • 동작방식:

    • 쉘에서 exec 라는 시스템 호출로 새로운 프로세스를 실행하고, 그 과정에서 fork라는 메커니즘으로 자식을 만들어 연결
    • 프로세스의 표준 출력(stdout)을 다음 프로세스의 표준 입력(stdin)으로 연결합니다.
  • 예시:

    • $ ls | sort | less
      • ls: 현재 디렉토리의 파일/디렉토리 목록을 출력.
      • sort: ls의 출력 결과를 알파벳 순으로 정렬.
      • less: 정렬된 결과를 페이지 단위로 표시.
      • 결과: 파일 목록을 정렬된 형태로 확인.
    • $ ls -l | grep key | less
      • ls -l: 파일의 상세 정보 출력.
      • grep key: 출력된 내용 중 key라는 문자열을 포함한 행만 필터링
      • less: 필터링된 결과를 페이지 단위로 표시.
      • 결과: key를 포함하는 파일 정보만 확인.

파일 위치를 모를때 찾는 방법
$ sudo find / -name access.log find 명령어를 이용하여 access.log 파일의 위치를 찾는다.

  • grep : 특정 문자열을 포함하는 데이터를 필터링(문자열 중 특정 정규표현식 조건 검색)

  • tail : 파일의 마지막 몇 줄을 실시간으로 출력(실시간 로그 조회 중 원하는것만 조회 시)

    • 로그에서 특정 문자열 검색:

      • tail -f /opt/homebrew/var/log/nginx/access.log| grep favicon.ico
        • 결과 : access.log의 새로 추가되는 로그 중 favicon.ico를 포함한 행만 출력.
    • 정규표현식 사용:

    • 검색된 라인 주변 출력:

      • $ grep -A 10 -B 10 "ERROR" /var/log/app.log
        • 결과 : "ERROR" 문자열이 포함된 라인과 함께 위아래 10줄씩 출력.
      • 개발 회사에서 Tomcat 서버에 문제가 생겼을때 로그 내 특정 ID 로 검색하면
        • 몇시몇분몇초에 에러가 발생했는지, 에러가 왜 발생했는지 추적이 가능
        • -A 10 혹은 -B 10, -C 10 : 해당 검색된 라인의 앞과 뒤에 50라인씩 추가로 출력해보면 좋다.

4.2 명령어 확장: 리다이렉션(>, <, >>)

  • 개념:

    • 리다이렉션은 명령어의 입출력 방향을 바꾸는 기능.
    • > : 출력 결과를 파일에 쓰기(덮어쓰기).
    • >> : 출력 결과를 파일에 쓰기(이어쓰기).
    • < : 파일의 내용을 명령어의 입력으로 전달.
  • 예시:

    • pbcopy : 클립보드에 복사하기 (매번 마우스로 드래그 복사 X) | 윈도우에서는 clip 명령어를 사용

    • pbcopy < ~/.gitignore_global | 윈도우에서는 clip < ~/.gitignore_global

      • ~/에 위치해있는 .gitignore_global파일의 내용을 클립보드로 복사.
      • (Windows에서는 clip사용)
    • pbcopy < .ssh/id_rsa.pub | 윈도우에서는 clip < ~/.gitignore_global

      • .ssh/에 위치해있는 id_rsa.pub파일의 내용을 클립보드로 복사.
      • (Windows에서는 clip사용)
    • cat ~/.gitignore_global | pbcopy | 윈도우에서는 cat ~/.gitignore_global | cliip

      • ~/에 위치해있는 .gitignore_global파일의 내용을 클립보드로 복사.
      • (Windows에서는 clip사용)
    • echo 복습 : echo "Hello, World!" >> example.txt

      • echo 명령어의 출력("Hello, World!")을 example.txt 파일에 저장
      • 만약 example.txt 파일이 이미 존재하면 이어서 씀.
    • cat 복습 : cat example.txt > copy.txt

      • example.txt의 내용을 읽어와 copy.txt에 저장.
      • copy.txt가 이미 있으면 기존 내용을 덮어씀.

4.3. 기타 명령어 확장

  • &&(AND) : 독립적으로 개별 수행 → 앞의 명령어가 성공했을 때만 다음 명령어 실행

    • | 파이프와 달리 앞 명령어 결과가 다음 명령어의 입력으로 들어가지 않음
    $ mkdir new_dir && cd new_dir
    • mkdir new_dir이 성공하면(new_dir 폴더 생성), cd new_dir 실행.
  • ;(SEQUENTIAL) : 앞 명령어가 성공 혹은 실패해도, 다음 명령어 실행 (&& 보다 완화된 연결)

    $ mkdir new_dir; cd new_dir
    • mkdir new_dir의 성공 여부에 상관없이 cd new_dir 실행.
  • &(BACKGROUND EXECUTION) : 앞 명령어와 다음 명령어 동시실행 → 명령어를 백그라운드 실행하여 비동기처리를 할수있음.

     $ sleep 10 &
    • sleep 10이 백그라운드에서 실행되고, 쉘이 즉시 다음 명령어를 입력받을 준비.
  • || : 앞 명령어가 실패하면, 다음 명령어 실행

    $ mkdir new_dir || echo "Directory creation failed"
    • mkdir new_dir이 실패하면 "Directory creation failed" 메시지 출력.

5. 유틸리티

  • chmod : 파일 권한 설정

    • 숫자값: 4 (READ) + 2 (WRITE) + 1 (EXECUTE) | 대상 : Owner + Group + Other
      • chmod 700 executable.sh = Owner 에게 4(READ) + 2(WRITE) + 1(EXECUTE) 권한 추가
      • chmod +rwx all-allow.sh = chmod a+rwx all-allow.sh = chmod 777 all-allow.sh
      • chmod u+rwx executable.sh = chmod 700 executable.sh
        • u : user
        • g : group
        • o : others
        • a : all
      • chmod 400 readable.sh = Owner 에게 4(READ) 권한 추가
      • chmod 500 excutable.sh = Owner 에게 4(READ) + 1(EXECUTE) 권한 추가
  • tar : TAR 로 압축된 파일 풀기 | tar -xvf apache-tomcat-9.0.16.tar

    • -x : extract 압축풀기 ↔ -c : create 압축하기
    • -v : verbose 어떤 파일이 풀리는지 상세히보기 - 어떤 파일이 처리되는지 출력.
    • -f : filename 지정 - 특정 파일을 처리
      • tar -cvf archive.tar file1 file2 : file1file2archive.tar라는 파일로 압축.
  • sudo : 관리자 권한 실행

    • sudo는 SuperUser Do의 약자, 3개의 유저 (Root, User, Guest) 중 Root 권한 실행 | su root 권한 얻기, switch
    • 예제:
      • sudo apt update : 패키지 목록 업데이트를 관리자 권한으로 실행.
      • sudo su : 관리자 계정으로 전환.
    • su와의 차이
      • sudo : 특정 명령어만 관리자 권한으로 실행.
      • su : 관리자 계정으로 전환하여 계속 권한 유지.
  • vi : 텍스트 에디터 ↔ code : VSCode 에디터

    • vi는 기본적으로 설치된 명령줄 텍스트 에디터
    • 입력 모드와 명령 모드를 전환하며 파일을 편집.
    • 간단한 명령어
      • 파일 열기: vi filename
      • 입력 모드로 전환: i
      • 변경 사항 저장 후 종료: :wq
      • 저장하지 않고 종료: :q!
    • 비교
      • vi: 기본 텍스트 에디터.
      • code: VSCode(비주얼 스튜디오 코드)로 파일 편집.

0개의 댓글