[모두의 리눅스] 11장 표준 입출력과 파이프라인

aramjs·2023년 10월 23일

Linux

목록 보기
8/14
post-thumbnail

11.1 표준 입력, 표준 출력, 표준 에러 출력

리눅스에서는 cat같은 명령어를 실행하면 자동으로 표준 입출력 채널이 열린다.

채널 : 데이터가 흐르는 길

표준 입출력

  • 표준 입력 stdin : 프로그램에 데이터를 입력하는 채널.
    키보드를 통한 입력이 대표적이다.

  • 표준 출력 stdout : 프로그램의 실행 결과가 출력되는 채널.
    단말 디스플레이에 출력된다.

  • 표준 에러 출력 stderr : 프로그램 실행 중 발생하는 에러 메시지가 출력되는 채널.
    보통 표준 출력과 동일하게 단말 디스플레이에 출력된다.

  • 명령어는 단순히 표준 입력을 읽어 결과를 표준 출력으로 출력한다.

  • 입력은 키보드, 파일이 될 수 있다.

  • 출력은 모니터, 프린터, 파일이 될 수 있다.

  • 명령어의 입출력을 표준 입출력으로 추상화한다.

  • 명령어 내부에서는 입출력을 신경쓰지 않고 사용자가 지정할 수 있다.


11.2 리다이렉션

  • 리다이렉션 redirection : 표준 입출력을 어디로 할 지 변경하는 것이다.

표준 입력의 리다이렉션

키보드 대신 파일을 표준 입력으로 연결할 수 있다.

  • cat < /etc/crontab : crontab 파일을 표준 입력으로 연결하여 cat 명령어에 전달한다. 파일의 내용이 그대로 출력된다.

  • cat /etc/crontab : 인자로 파일을 지정한 경우

두 방식의 출력 결과는 같다.
인자로 파일을 지정하는 것은 사용자의 편의를 위해 제공하는 방식이다.
표준 입력을 읽는 방식을 지원하도록 구현하는 것이 좋다.

표준 출력의 리다이렉션

  • ls -l / > list.txt : 실행 결과를 list.txt에 리다이렉션한다.

    • cat list.txt로 내용을 확인할 수 있다.
  • 리다이렉션 된 파일은 list.txt 자동적으로 만들어진다.

표준 에러 출력의 리다이렉션

표준 에러 출력은 표준 출력과 동일한 디스플레이에 연결되어있어 표준 출력에 의한 출력인지, 표준 에러 출력에 의한 출력인지 구분이 어렵다.

표준 출력을 파일에 리다이렉션하여 구분할 수 있다.

  • ls -l f1 > list.txt : 표준 출력을 list.txt 파일에 리다이렉션 한다.

에러 메시지가 화면에 출력된다.
표준 출력과 에러 출력이 별도의 채널을 사용하기 때문이다.

에러 출력도 리다이렉션해준다.
2>

  • ls -l f1 2> error.txt : 표준 에러 출력을 error.txt 파일에 리다이렉션 한다.

    • 에러가 콘솔에 출력되지 않고 파일에 저장된다.

    • 명령어 실행 결과와 에러 메시지를 별도로 다루기 위해 존재한다.

  • ls -l f1 > list.txt 2> error.txt : stdout과 stderr을 각 다른 파일에 리다이렉션 한다.

    • 콘솔에 출력되지 않는다.
  • ls -l f1 > result.txt 2>&1 : stdout과 stderr을 한 파일인 result.txt에 리다이렉션한다.

    • 표준 출력을 리다이렉션 후 2>&1 을 붙인다.

    • &1 : 표준 출력을 의미한다.

    • &0 : 표준 입력

    • &2 : 표준 에러 출력

리다이렉션으로 파일 덮어쓰기

  • 이미 존재하는 파일에 리다이렉션하면 덮어쓰게 된다.

    • cat으로 확인한다.
  • > 대신 >> 을 사용하면 덮어쓰지 않고 파일 끝에 기록한다.

  • set -o noclobber : 덮어쓰기를 방지한다.

/dev/null

  • /dev/null : 특수 파일. 에러 확인으로 사용한다.

    • 입력 파일로 지정해도 아무것도 입력되지 않는다.

    • 출력 파일로 지정해도 아무것도 기록되지 않는다.

    • 표준 에러 출력만 콘솔에 출력된다.

    • 표준 출력 양이 많거나 에러만 확인할 때 사용한다.

    • 불필요한 에러가 많은 경우 이쪽으로 리다이렉션 하기도 한다.

    • ls /bin > /dev/null 2>&1 : 모든 출력을 null에 한다. 명령어의 실행 시간을 확인할 때 사용한다.


11.3 파이프라인

여러 명령어를 연결하려면 한 명령어의 결과를 다른 명령어에 입력할 수 있어야 한다.
명령어 결과가 많을 때 사용한다.

  • 파이프라인 : 명령어의 표준 출력을 다른 명령어의 표준 입력으로 연결한다.

  • 명령어 실행 결과를 파일에 리다이렉션 후 less로 조회한다. --> 비효율적

    • ls -l / > file.txt
    • less file.txt
  • ls -l / | less : ls -l의 결과를 less의 입력으로 전달한다. 한 페이지씩 보여준다.

  • history | less : 페이지 단위로 읽을 수 있다.

  • ls -l /etc | cat -n | less : 결과를 cat 행 번호와 함께 출력하고 한 페이지씩 표시한다.

  • 기본적으로 표준 출력만 다음 명령어에 연결한다.

    • 에러 출력도 보내려면 2>&1 을 사용하여 표준 출력과 동일한 곳으로 보내야 한다.

    • ls -l / /etc 2>&1 | less : 두 출력 모두 less로 넘겨준다.


11.4 필터 명령어

  • 필터 명령어 : 표준 입력을 받아 표준 출력으로 출력하는 명령어이다.

  • head : head /etc/crontab

    • 지정한 파일의 첫 행부터 지정한 행까지 출력한다.

    • 기본값으로 10행을 출력한다.

    • 입력 파일을 지정하지 않으면 표준 입력을 받는다.

    • history | head : history의 결과를 head에 넘긴다. 10행이 출력된다.

  • cat : 입력 내용을 그대로 출력

  • head : 파일 앞부분을 출력

  • tail : 파일 뒷부분을 출력

  • grep : 검색 패턴에 일치하는 행을 출력

  • sort : 정렬

  • uniq : 중복된 행을 제거하여 출력

  • tac : 역순으로 출력

  • wc : 행 수나 바이트 수를 출력

명령어 조합

  • du -b /bin/* : /bin 디렉터리 아래의 모든 파일의 크기를 출력한다.
    • 왼쪽은 파일 크기, 오른쪽을 파일명으로 출력한다.
  • du -b /bin/* | sort -n : 파일 크기가 작은 것부터 출력한다.

  • du -b /bin/* | sort -n | tac : 파일 크기가 큰 것부터 출력한다.

  • du -b /bin/* | sort -n | tac | head -n 5 : 크기가 큰 5개 파일만 출력.

profile
안녕하세요.

0개의 댓글