시프 15 -shell

강준호·2024년 6월 2일

시스템프로그래밍

목록 보기
10/18

수정된 부분을 포함하여 전체 내용을 풍부하게 작성해보겠습니다.


UNIX 셸

UNIX 셸의 개요

  • UNIX 셸은 역사적으로 사용자의 주요 시스템 인터페이스였습니다.
  • 시스템 호출에 직접적이지만 안전한 접근을 제공합니다.
  • 셸은 도입 당시 혁신적이었습니다.
  • 셸에 대해 이해하는 것이 유용합니다.

대화형 셸

셸의 이중 성격

  • 대화형 명령 프롬프트
  • 프로그래밍 환경
  • 대화형 세션은 입력을 요청하고 즉시 실행합니다.
  • 현대 셸은 명령 별칭, 최근 명령의 호출 및 수정과 같은 대화형 기능을 포함합니다.

셸 프로그래밍 환경

셸 프로그래밍 언어

  • 변수
  • 조건문 및 루프
  • 프로시저
  • 예외 처리
  • 주된 특징은 다른 프로그램의 실행입니다.
  • 셸 "프로그램"은 일반적으로 외부 프로그램의 조합입니다.

단어 처리

셸의 단어 처리

  • 셸은 입력을 단어로 나눕니다. 모든 것이 문자열입니다.
  • 단어는 공백으로 구분됩니다.
  • 명령의 첫 번째 단어는 셸이 무엇을 해야 할지 알려줍니다.
  • 단어는 작은따옴표('), 큰따옴표(") 또는 백슬래시()로 공백을 포함할 수 있습니다.
    • 예시: echo "Hello World", echo 'Hello World', echo Hello\ World

명령문

명령문의 처리

  • 명령문은 이전 명령 후에 시작되고, 새 줄, 세미콜론(;), 앰퍼샌드(&)로 끝납니다.
  • 셸은 명령문을 파싱한 후 다음 중 하나로 결정합니다:
    • 변수 할당(명령 포함 가능)
    • 내장 명령
    • 제어 문(if, while 등)
    • 실행할 외부 프로그램

내장 명령

셸 내장 명령

  • 내장 명령은 외부 프로그램을 실행하지 않고 셸 내부 코드를 실행합니다.
  • 내장 명령이 필요한 이유:
    • 효율성
    • 셸의 내부 상태를 변경해야 하는 경우
    • 제어 흐름 구조인 경우
  • 특히, 내부 상태 변경은 fork 후에 수행할 수 없습니다. 예를 들어, cd 명령은 반드시 내장 명령이어야 합니다.

외부 명령

셸에서 외부 명령 실행

  • 기타 명령문은 외부 명령입니다.
  • 셸은 fork()를 호출한 후 exec()로 외부 명령을 실행합니다.
  • 명령의 첫 번째 단어는 실행할 바이너리입니다.
  • 나머지 단어는 해당 바이너리에 대한 인수입니다.
    • 예시: cat file.txt 실행 시, cat이 바이너리이고 file.txt가 인수입니다.

변수

셸 변수

  • 셸 변수는 문자열입니다.
  • 변수는 선언할 필요가 없으며 전역적입니다.
  • 변수 생성 또는 할당은 = 기호를 사용합니다.
    • VAR=value
  • 변수 이름과 = 기호 사이에 공백이 없어야 합니다.

셸 변수를 사용할 때 주의사항

  • 쉘 변수를 선언할 때, 특히 명령의 출력을 변수에 할당할 때는 중괄호를 사용하여 명확하게 지정합니다.
    • 예시: VAR=$(cat fp) 대신 ${VAR}=$(cat fp)로 사용합니다.

특수 변수

셸의 특수 변수

  • 셸은 여러 특수 변수를 인식합니다:
    • $0: 현재 실행 파일의 이름
    • $1-$9: 첫 9개의 인수
    • $#: 유효한 인수의 수
    • $*$@: 모든 인수
    • $?: 이전 명령의 반환 값
    • $!: 이전 명령의 프로세스 ID
    • $PS1: 대화형 사용 시 프롬프트
    • $IFS: 입력 필드 구분자

입력 필드 구분자 (IFS)

IFS의 역할

  • 셸은 확장(변수 등)이 새로운 단어를 생성할 때 $IFS 문자를 사용합니다.
  • 기본 값은 새 줄, 탭, 공백입니다.

변수 삽입

변수 삽입의 형태

  • 변수는 단어에 삽입될 수 있습니다.
  • 기본 형태:
    • $VAR: 단순 변수 VAR 삽입
    • ${VAR}: 복잡한 이름의 변수 또는 추가 작업이 있는 변수 VAR 삽입

명령 삽입

명령 삽입의 형태

  • 명령의 출력도 명령에 삽입될 수 있습니다.
  • POSIX 구문 $(command):
    • 괄호 안의 명령을 실행
    • 명령의 출력을 $() 자리로 삽입

셸 변수와 환경 변수

셸과 환경 변수의 차이

  • POSIX 시스템의 모든 프로세스는 환경을 가집니다.
  • 환경은 키-값 쌍의 집합입니다.
  • 기본적으로 프로세스는 부모의 환경을 복사하여 상속합니다.
  • 셸은 셸 변수를 환경에 넣을 수 있습니다.
  • 내장 명령 export가 이를 수행합니다.
    • export VAR: 변수를 환경에 내보냅니다.
    • export VAR=value: 변수와 값을 함께 내보냅니다.
  • 변수가 내보내지 않으면 셸에만 사적으로 유지됩니다.

환경 설정

환경 변수 내보내기

  • export VAR [VAR2 ...]
  • export 명령의 인수로 지정된 모든 변수는 자식 프로세스의 환경에 복사됩니다.
  • env 명령은 환경을 출력하고 종료합니다.
    • 예시: env를 사용하여 현재 환경 변수를 모두 출력할 수 있습니다.

글로빙

파일 이름 패턴 매칭

  • 글로빙은 파일 이름 패턴 매칭을 수행합니다.
  • 글로브는 일치하는 파일 이름 목록으로 확장됩니다.
  • 기본 글로빙 도구:
    • *: 0개 이상의 문자 시퀀스
    • ?: 임의의 한 문자
    • []: 대괄호 안의 문자 중 하나; 범위 표현 가능 (예: [a-z])

글로빙 예시

  • *.c: 모든 .c 파일과 일치합니다.
  • *.?: 모든 확장자가 한 글자인 파일과 일치합니다.
  • *.[ch]: .c 또는 .h 확장자를 가진 모든 파일과 일치합니다.
  • variant-[a-d].pdf: variant-a.pdf에서 variant-d.pdf까지 일치합니다.

리디렉션과 파이프

파일 디스크립터 조작

  • 파이프 생성: |
  • 파일 디스크립터 열기: <, <<, >, >>
  • 파일 디스크립터 복사: >&

간단한 파일 리디렉션

표준 입출력 리디렉션

  • < file: 표준 입력을 파일에 연결
  • > file: 표준 출력을 파일에 연결
  • 2> file: 표준 오류를 파일에 연결
  • N>, N<: 지정된 파일을 파일 디스크립터 N에 연결
  • >>: 리디렉션된 출력 추가
    • 예시: cat fp >> out.txtfp의 내용을 out.txt 파일의 끝에 추가합니다.

파이프

파이프라인

  • 파이프라인은 파이프로 연결된 명령 시리즈입니다.
  • 각 명령은 표준 출력으로 쓰고, 표준 입력에서 읽습니다.
  • 셸은 pipe()dup2()를 사용하여 연결합니다.

파이프라인 예시

  • cmd1 | cmd2:
    • cmd1의 출력을 파이프로 연결하여 cmd2의 입력으로 사용합니다.
    • 셸은 pipe()dup2()를 사용하여 연결하고, fork()exec()로 명령을 실행합니다.

파일 디스크립터 복제

파일 디스크립터 복제 구문

  • N>&M: dup2(N, M)와 동일
  • N>&- 또는 <&-: 디스크립터 닫기
    • 예시: echo "Error message" 1>&2는 표준 출력을 표준 오류로 복사합니다.

요약

  • 셸은 여러 시스템 호출을 거의 직접적으로 노출합니다:
    • fork()/exec()
    • open()
    • close()
    • dup2()
    • wait()
  • 셸은 대화형 및 프로그래밍적 기능을 모두 제공합니다.

필기 내용을 반영하여 추가 설명

단어 처리

  • 문자열에 공백이

    포함된 경우, 작은따옴표('), 큰따옴표(") 또는 백슬래시()를 사용하여 공백을 포함한 단어로 인식되도록 합니다.

    • 예시: echo "Hello World", echo 'Hello World', echo Hello\ World

내장 명령의 이유

  • 내장 명령을 사용하는 이유는 효율성 때문입니다.
  • 내장 명령은 셸의 내부 상태를 변경해야 할 때 필요합니다.
    • 예시: cd 명령은 반드시 내장 명령이어야 합니다. 외부 프로그램으로 실행될 수 없습니다.

외부 명령 실행 구조

  • 외부 명령(예: cat)은 셸이 fork()를 호출하여 새 프로세스를 생성한 후, exec()를 사용하여 해당 바이너리를 실행하는 구조입니다.
    • 예시: cat file.txt 실행 시, fork()를 통해 새 프로세스를 생성하고, exec()를 통해 cat 바이너리를 실행합니다.

변수 선언과 사용

  • 셸 변수를 선언할 때는 중괄호를 사용하여 명확하게 지정합니다.
    • 예시: VAR=$(cat fp) 대신 VAR=$(cat fp)로 사용하지 않고, VAR=$(cat fp)로 명확하게 지정합니다.

환경 변수 내보내기

  • export 명령은 변수를 환경에 내보냅니다.
    • 예시: export HOME=valueHOME 변수를 환경에 설정합니다.
  • env 명령을 사용하여 모든 환경 변수를 출력할 수 있습니다.
    • 예시: env 명령은 현재 환경 변수를 모두 출력합니다.

파일 리디렉션

  • 데이터를 파일에 추가하려면 >> 연산자를 사용합니다.
    • 예시: cat fp >> out.txtfp의 내용을 out.txt 파일의 끝에 추가합니다.

이와 같이, 기존 내용을 보강하여 UNIX 셸에 대한 전반적인 이해를 돕고, 필기 내용을 자연스럽게 포함시켰습니다.

0개의 댓글