오늘의 인기 글
최근 글
최근 댓글
Today
Total
11-23 00:00
관리 메뉴

우노

[Linux] 재지향(Redirection)이란? 본문

Operating System/Linux & Ubuntu

[Linux] 재지향(Redirection)이란?

운호(Noah) 2020. 9. 15. 11:06
  • 오늘은 리눅스의 I/O 재지향(redirection)에 대해서 설명드리겠습니다.
  • 재지향파이프(pipe)와 더불어 리눅스의 명령어들을 훨씬 강력하게 무장시켜주는 역할을 하는 핵심 기능입니다.

개요

  • 리눅스 쉘은 항상 아래와 같이 표준 입출력파일 형태 로 열고 있습니다.

    • 표준입력 ( stdin: 키보드)
    • 표준출력( stdout: 모니터)
    • 표준에러( stderr: 모니터)
  • 기본적으로 프로그램은 연산 결과를 출력 장치(파일, 모니터, 프린터 등)로 내보내는데요.

  • 이 출력되는 데이터를 임의로 다른 장치로 보내는 것을 재지향(redirection)이라고 합니다.

  • 다시 말하면 파일이나 프로그램, 명령어 등의 출력을 낚아채어 다른 파일이나 프로그램, 명령어의 표준 입력으로 보내는 것을 말합니다.

사용법

  • 표준 입출력은 파일 형태로 열려 있다고 말씀드렸는데요.

  • 리눅스에서 열려 있는 파일은 파일 디스크립터(file descriptor)를 할당 받게 됩니다.

    • 표준 입력(stdin) = 0
    • 표준 출력(stdout) = 1
    • 표준 에러(stderr) = 2
  • 이렇게 0, 1, 2파일 디스크립터를 할당받기 때문에 이를 이용해서 재지향을 할 수 있습니다.

  • < file

    • 파일로부터 표준 입력을 받도록 재지향합니다.
  • > file

    • 표준 출력을 파일로 재지향 합니다.
    • 파일이 없으면 새로 만들고, 파일이 있으면 덮어씁니다.
  • >> file

    • 표준 출력을 파일로 재지향 합니다.
    • 파일이 없으면 새로 만들고, 파일이 있으면 파일의 끝에 덧붙입니다.
  • 2>&1

    • 표준 에러를 표준 출력으로 재지향합니다.
    • 표준 에러도 표준 출력의 자격으로 보내집니다.

예제

  • 명령어 예제

    • test.py의 입력으로 test.in 파일을 받는다.

        python3 test.py < test.in
    • test.py의 실행결과를 test.out 파일로 저장한다.

        python3 test.py > test.out
    • test.py의 입력으로 test.in 파일을 받고 출력을 test.out 파일에 저장한다.

        python3 test.py < test.in > test.out
    • (Pipe 사용) test.py의 입력으로 test.in을 받고 결과를 test1.py의 입력으로 넣는다.

        python3 test.py < test.in | python3 test1.py
    • python 파일 내부의 stdin, stdout 예제 코드

        import re
        from collections import Counter
        import sys
      
        # 파일 입력 받기
        document = sys.stdin.read()
      
        # 문자열 전체 소문자로 변환
        document_lower = document.lower()
      
        # 문자열에서 알파벳과 숫자만 가져와 리스트화
        words = re.findall('[a-z0-9]+',document_lower)
      
        # 문서에 나타난 단어 리스트 Count
        word_counts = Counter(words)
      
        # 가장 많이 등장한 단어 1000개 뽑아 stdout으로 적기
        for word, count in word_counts.most_common(1000):
            sys.stdout.write(word + '\t' + str(count) + '\n')
Comments