books/Linux

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

836586697769 2024. 7. 31. 12:47
  • 표준 입력(stdin): 프로그램에 데이터를 입력하는 채널
  • 표준 출력(stdout): 프로그램의 실행 결과가 출력되는 채널
  • 표준 에러 출력(stderr): 프로그램 실행 중 발생하는 에러 메시지가 출력되는 채널
  • 리다이렉션: 표준 입출력을 어디로 연결할지 변경하는 것

 

표준 입력의 리다이렉션

  • cat 명령어를 실행할 때 인자를 지정하지 않으면 키보드로 입력될 때까지 커서가 정지됨

→ cat 명령어가 표준 입력으로 입력한 내용을 읽어서 그대로 표준 출력에 출력하는 명령어이기 때문

→ 이 방식을 지원하도록 구현하는 것이 좋음

$ cat < /etc/crontab # 입력 리다이렉션 사용 (/etc/crontab 파일을 cat 명령어에 전달)
$ cat /etc/crontab # 인자로 파일 지정

 

표준 출력의 리다이렉션

$ ls -l > list.txt # 출력 리다이렉션 사용 (명령어의 실행 결과를 파일에 저장)

 

표준 에러 출력

  • 표준 출력을 파일에 리다이렉션해도 에러 메시지는 콘솔에 출력됨

→ 표준 출력과 표준 에러 출력이 별도의 채널을 사용하기 때문

$ ls /xxxxx > list.txt
ls: '/xxxxx'에 접근할 수 없습니다: 그런 파일이나 디렉터리가 없습니다

$ ls /xxxxx 2> error.txt # 에러 메시지를 파일에 저장
# 콘솔에 아무것도 출력되지 않음

$ ls /xxxxx > list.txt 2> error.txt # 표준 출력과 에러 출력을 각각 다른 파일에 리다이렉션
# 콘솔에 아무것도 출력되지 않음

 

표준 출력과 표준 에러 출력을 함께 리다이렉션

$ ls /xxxxx > result.txt 2>&1
  • 표준 입출력에 매핑된 숫자
입출력 채널 숫자
표준 입력 0
표준 출력 1
표준 에러 출력 2
  • 이미 존재하는 파일에 표준 출력을 리다이렉션하면 기존 파일을 지우고 덮어쓰게 되므로 방지해야 함
# 1. >> 사용
$ echo 123 > number.txt
$ echo 456 >> number.txt

# 2. noclobber 지정
$ set -o noclobber
$ ls -l > list.txt
-bash: list.txt: 이미 있는 파일을 덮어쓸 수 없음

 

/dev/null

  • 입출력 파일로 지정해도 아무 내용도 입출력 되지 않는 특수 파일
  • 표준 입력으로 /dev/null을 리다이렉션하면 아무 내용도 입력되지 않아 아무것도 출력되지 않음
  • 표준 출력을 /dev/null로 리다이렉션하면 표준 출력이 콘솔에 출력되지 않음
  • 표준 에러는 출력되므로 표준 에러 출력만 확인할 때 자주 사용하는 방식
  • 확인하지 않아도 되는 에러 메시지가 너무 많이 출력되는 경우 표준 에러 출력을 /dev/null로 리다이렉션 하기도 함

 

파이프라인

  • 파이프라인을 사용하면 명령어의 표준 출력을 다른 명령어의 표준 입력으로 연결 가능
  • <명령어 1> | <명령어 2> | <명령어 3> … → 첫 번째 명령어의 표준 출력이 두 번째 명령어의 표준 입력으로 전달
# 파이프라인 사용 전
$ ls -l / > temp_list.txt
$ less temp_list.txt

# 파이프라인 사용 후
$ ls -l / | less
  • 기본적으로 표준 출력만 다음 명령어에 연결하며, 표준 에러 출력도 함께 보내려면 2>&1 사용
$ ls -l / /xxxxx 2>&1 | less

 

필터 명령어

  • 표준 입력을 받아들여 표준 출력으로 출력하는 명령어 e.g. cat
$ head /etc/crontab # 출력할 행 수 지정하지 않으면 첫 10행 출력
$ history | head # 명령어 이력의 첫 10행만 출력
  • 대표적인 필터 명령어
명령어 역할
cat 입력 내용을 그대로 출력
head 파일 앞부분을 출력
tail 파일 뒷부분을 출력
grep 검색 패턴에 일치하는 행을 출력
sort 정렬
uniq 중복된 행을 제거하여 출력
tac 역순으로 출력
wc 행 수나 바이트 수를 출력
  • 필터 명령어는 파이프라인을 사용하여 다른 명령어와 조합할 때 진가가 발휘됨
# /bin 디렉터리 아래의 모든 파일의 크기(바이트) 출력
$ du -b /bin/*

# 결과를 크기 순으로 정렬하여 출력
$ du -b /bin/* | sort -n

# 파일 크기가 큰 순으로 정렬하여 출력
$ du -b /bin/* | sort -n | tac

# 파일 크기가 큰 상위 5개의 파일만 출력
$ du -b /bin/* | sort -n | tac | head -n 5