Linux I/O Redirection & Pipe

Linux

0 views

1. 개념 및 정의

1.1 한 줄 요약

  • "데이터의 흐름을 수도관(Pipe)처럼 연결하거나, 물줄기의 방향을 바꿔 양동이(File)에 담는 작업이다."
    • Pipe (|)
      • 호스와 호스를 연결하여 물(데이터)이 계속 흐르게 하는 것.
    • Redirection (>, >>****, <****)
      • 호스 끝의 물(데이터)을 화면이 아닌 파일(양동이)로 돌리거나, 반대로 파일의 내용을 프로그램에 주입하는 것.

1.2 공식 정의

  • 리눅스 셸 환경에서 표준 스트림의 흐름을 제어하는 메커니즘이다.
    • Redirection (재지향)
      • 표준 입력(stdin), 표준 출력(stdout), 표준 에러(stderr)의 입출력 대상을 화면(터미널)이나 키보드가 아닌 '파일'이나 '장치'로 변경하는 행위.
    • Pipe (파이프)
      • 한 프로세스의 표준 출력을 다른 프로세스의 표준 입력으로 직접 연결하는 IPC(Inter-Process Communication) 기법.

2. 동작 원리

  • 단순히 기호를 외우는 것이 아니라, 리눅스 커널이 이 기호들을 어떻게 처리하는지 이해해야 한다.
    • 핵심은 파일 디스크립터(File Descriptor, FD)에 있다.

2.1. 표준 스트림과 파일 디스크립터

  • 리눅스 운영체제는 모든 입출력을 파일로 간주하며, 실행 중인 프로세스는 기본적으로 3개의 파일 디스크립터를 할당받는다.
FD 번호이름영문명 (Abbr.)기본 대상설명
0표준 입력stdin키보드프로그램에 데이터를 입력받는 통로
1표준 출력stdout모니터(터미널)정상적인 실행 결과를 출력하는 통로
2표준 에러stderr모니터(터미널)오류 메시지를 출력하는 통로

2.2. Redirection의 내부 동작 (>, >>****)

  • 사용자가 ls > result.txt를 실행하면 셸 내부에서는 다음과 같은 시스템 호출 과정이 일어난다.
    1. fork()
      1. 셸이 새로운 자식 프로세스를 생성한다.
    2. open()
      1. result.txt 파일을 연다. (파일이 없으면 생성, 있으면 내용 삭제 후 열기)
    3. dup2()
      1. 기존의 FD 1(stdout)을 닫고, 방금 연 result.txt의 파일 디스크립터를 FD 1로 복제한다.
    4. exec()
      1. ls 명령어를 실행한다.
      2. 이때 ls는 평소처럼 FD 1에 결과를 쓰지만, FD 1이 화면이 아닌 파일로 바뀌어 있으므로 결과가 파일에 저장된다.

2.3. Pipe의 내부 동작 (|)

  • command A | command B를 실행하면 다음과 같이 작동한다.
    1. 커널 영역에 파이프(버퍼)를 생성한다.
    2. command A의 FD 1(stdout)을 파이프의 입구(Write end)에 연결한다.
    3. command B의 FD 0(stdin)을 파이프의 출구(Read end)에 연결한다.
    4. A가 쓴 데이터는 디스크를 거치지 않고 메모리 버퍼를 통해 B로 즉시 전달된다.

참고: 파이프는 단방향 통신이며, 데이터는 FIFO(First In First Out) 구조로 흐른다.

3. 사용법 및 구문 (Syntax)

3.1. Redirection (파일 입출력 제어)

  • 출력 방향 변경 (>, >>****)

    • > (Overwrite)

      • 명령의 결과를 파일에 저장한다.
      • 기존 파일 내용은 삭제(덮어쓰기)된다.
    • >> (Append)

      • 명령의 결과를 파일 끝에 추가한다.
      • 기존 내용은 보존된다.
      # 1. 파일 덮어쓰기 (기존 내용 삭제됨)
      echo "Hello World" > hello.txt
      
      # 2. 파일 이어쓰기 (기존 내용 뒤에 추가됨)
      echo "Next Line" >> hello.txt
      
  • 입력 방향 변경 (<, <<****)

    • < (Input Redirection)
      • 키보드 대신 파일의 내용을 명령어의 입력으로 사용한다.
    • << (Here Document)
      • 셸 스크립트 내에서 여러 줄의 텍스트를 입력으로 전달할 때 사용한다.
# cat 명령어가 키보드 입력이 아닌 hello.txt 내용을 읽음
cat < hello.txt

# EOF를 만날 때까지 입력된 텍스트를 cat의 입력으로 전달
cat << EOF > script_msg.txt
This is line 1
This is line 2
EOF

3.2. Pipe (프로세스 연결)

  • |
    • 앞 명령어의 출력을 뒤 명령어의 입력으로 넘긴다.
# ps(프로세스 목록) 결과를 grep(검색)으로 넘겨 'python' 단어가 포함된 줄만 출력
ps aux | grep python

3.3. 파일 디스크립터 응용 (&, 2>****)

  • 질문한 &는 단독으로 쓰일 때와 리다이렉션과 함께 쓰일 때 의미가 다르다.
    1. 백그라운드 실행 (&)

      1. 명령어 뒤에 붙이면 터미널을 점유하지 않고 뒤에서 실행한다.

        ping google.com &
        
    2. 에러 리다이렉션 (2>)

      1. 표준 에러(FD 2)만 따로 파일로 저장한다.

        # 정상 결과는 화면에, 에러만 error.log에 저장
        gcc main.c 2> error.log
        
    3. 표준 출력/에러 통합 (2>&1, &>****):

      1. 정상 결과와 에러를 한 곳으로 모은다.

        • 2>&1: "FD 2번(에러)을 FD 1번(출력)이 가리키는 곳으로 보내라"는 의미다.
        # stdout과 stderr 모두 debug.log에 저장
        ./script.sh > debug.log 2>&1
        
        # 위와 동일한 최신 문법 (Bash 4.0+)
        ./script.sh &> debug.log
        
        # 에러 메시지를 쓰레기통(/dev/null)으로 보내서 화면에 안 뜨게 함
        find / -name "secret" 2> /dev/null
        
기호명칭 (Name)기능 설명 (Description)사용 예시
``Pipe왼쪽 명령의 출력을 오른쪽 명령의 입력으로 전달한다.
>Output Redirection
(Overwrite)명령의 결과를 파일에 저장한다. (기존 내용 삭제)ls > list.txt
>>Output Redirection
(Append)명령의 결과를 파일 끝에 추가한다. (기존 내용 보존)echo "End" >> log.txt
<Input Redirection키보드 대신 파일의 내용을 명령의 입력으로 사용한다.sort < data.txt
2>Error Redirection에러 메시지(stderr)만 따로 파일에 저장한다.gcc main.c 2> error.log
2>&1Merge Output에러(2)를 표준 출력(1)이 가리키는 곳으로 함께 보낸다.command > all.log 2>&1
&Background명령어를 백그라운드(뒷단)에서 실행한다.sleep 100 &
;Separator앞 명령의 성공 여부와 관계없이 순차적으로 실행한다.cd .. ; ls
&&Logical AND앞 명령이 성공(0)했을 때만 뒤 명령을 실행한다.make && make install
``Logical OR

Loading comments...