ioerror

| , |& 사용법 및 옵션 - 명령어 표준 출력을 다른 명령어의 표준 입력으로 연결하는 파이프 연산자 본문

OS

| , |& 사용법 및 옵션 - 명령어 표준 출력을 다른 명령어의 표준 입력으로 연결하는 파이프 연산자

반응형

❘ , ❘& 사용법 및 옵션 - 명령어 표준 출력을 다른 명령어의 표준 입력으로 연결하는 파이프 연산자

| , |& - pipe / pipe with stderr operator

명령어 표준 출력을 다른 명령어의 표준 입력으로 연결하는 파이프 연산자

유닉스 및 리눅스 쉘(Shell) 환경에서 파이프 연산자(|, |&)는 앞서 실행된 명령어의 표준 출력(stdout) 또는 표준 에러(stderr) 스트림을 디스크에 저장하지 않고, 뒤따르는 명령어의 표준 입력(stdin)으로 직접 연결하여 연속 처리하는 핵심 프로세스 간 통신(IPC) 기호이다.

1. 명령어 용도

  • 사용가능 OS, Shell: POSIX 호환 모든 유닉스 및 리눅스 쉘 (|), Bash 4.0+/zsh/tcsh (|&)
  • 대용량 로그 파일이나 텍스트 데이터 출력을 grep, awk, sed, sort 등의 필터링 도구와 연계하여 원하는 데이터만 즉시 가공·추출하는 경우
  • 명령어 실행 중 발생하는 오류 메시지(stderr)와 정상 출력(stdout)을 모두 모아 한 번에 검색하거나 페이저(less) 프로그램으로 확인하는 경우
  • 서버 모니터링 시 프로세스 목록(ps aux) 중 특정 프로세스 개수나 상태를 파이프라인으로 연결하여 실시간 집계하는 경우

2. 명령어 서식

Bash
 
# 1. 기본 파이프 (표준 출력만 전달)
command1 | command2 [| command3 ...]

# 2. 표준 출력과 표준 에러 통합 파이프 (Bash 4.0+/zsh)
command1 |& command2

# 3. POSIX 호환 표준 출력 및 표준 에러 통합 파이프
command1 2>&1 | command2

3. 명령어 옵션

  • 주요 옵션 소개 테이블
연산자/구문 설명 사용가능 OS 및 쉘
cmd1 | cmd2 cmd1의 표준 출력(stdout, FD 1)을 cmd2의 표준 입력(stdin, FD 0)으로 전달하다. [POSIX/Shell]
cmd1 |& cmd2 cmd1의 표준 출력(FD 1)과 표준 에러(FD 2)를 모두 cmd2의 표준 입력으로 전달하다. [Bash 4.0+/zsh/tcsh]
cmd1 2>&1 | cmd2 cmd1의 표준 에러를 표준 출력에 병합한 후 cmd2로 전달하는 POSIX 호환 방식이다. [POSIX/Shell]
set -o pipefail 파이프라인으로 연결된 명령어 중 하나라도 실패(비zero 반환)하면 전체 파이프라인의 종료 상태를 실패로 처리하도록 쉘 옵션을 설정하다. [Bash/zsh/ksh]
${PIPESTATUS[@]} 파이프라인 내에서 실행된 각 명령어들의 종료 코드(Exit Status) 배열을 조회하다. [Bash]
$pipestatus 파이프라인 내 각 명령어의 종료 코드를 담고 있는 배열 변수이다. [zsh]
  • 명령어 옵션 사용시 결과 예시
Bash
 
# 1. 기본 파이프 (|) - 프로세스 목록에서 특정 단어(nginx) 검색
ps aux | grep "nginx"
# output:
# root      1234  0.0  0.1  10240  2048 ?        Ss   10:00   0:00 nginx: master process
# www-data  1235  0.0  0.2  10600  3072 ?        S    10:00   0:00 nginx: worker process

# 2. 파이프를 이용한 텍스트 카운팅 (grep + wc)
grep -i "error" /var/log/syslog | wc -l
# output:
# 42

# 3. 표준 출력과 표준 에러 동시 전달 (|&) [Bash 4.0+/zsh]
ls -l /bin/bash /invalid_path |& grep "No such file"
# output:
# ls: cannot access '/invalid_path': No such file or directory

# 4. pipefail 옵션 적용 후 PIPESTATUS 확인 [Bash]
set -o pipefail
cat non_existent_file.txt | grep "test"
echo ${PIPESTATUS[@]}
# output:
# cat: non_existent_file.txt: No such file or directory
# 1 1  (첫 번째 cat 명령어와 두 번째 grep 명령어 모두 실패 코드를 반환하다)

4. 명령어 특이사항(유의사항)

  • 서브쉘(Subshell) 비동기 실행 및 변수 공유 불가: 파이프라인(|)으로 연결된 각 명령어는 쉘의 별도 서브쉘(Subshell) 프로세스에서 실행된다. 따라서 파이프 오른쪽 명령에서 쉘 변수 값을 변경하거나 cd 명령을 실행하더라도, 파이프 실행이 끝난 후 원래의 메인 쉘 환경에는 아무런 영향을 주지 않다.
  • 종료 상태 코드(Exit Code) 유의점: 기본적으로 파이프라인 연결 전체의 종료 상태는 가장 마지막에 실행된 명령어의 종료 상태를 따라간다. 앞쪽 명령어가 실패하더라도 마지막 명령어가 성공하면 $? 값은 0(성공)을 반환한다. 이를 방지하려면 set -o pipefail 옵션을 미리 활성화해야 하다.
  • |&와 POSIX 이식성: |& 연산자는 Bash 4.0 이상, zsh, tcsh 등 최신 단독 쉘에서 제공하는 편의 문법이다. /bin/sh 기반의 순수 POSIX 호환 스크립트 작성 시에는 2>&1 | 구문을 사용하는 것이 안전하다.
  • 버퍼링(Buffering) 현상: 파이프 라인을 거쳐 데이터를 전달할 때 표준 출력이 터미널이 아닌 파이프 파일 기술자로 변경되므로 블록 버퍼링(Block Buffering)이 수행되어 실시간 출력이 지연될 수 있다. 실시간 출력이 필요한 경우 stdbuf 명령어를 혼용하다.

관련 명령어들

  • grep: 파일이나 파이프 입력에서 지정한 패턴 텍스트를 검색하다.
  • tee: 표준 입력을 받아 표준 출력으로 출력함과 동시에 파일로도 기록하다.
  • xargs: 표준 입력으로 전달된 텍스트 데이터를 받아 다른 명령어의 인자(Arguments)로 변환하여 실행하다.
  • less: 대용량 파이프 출력을 한 페이지씩 나누어 볼 수 있게 하는 터미널 페이저이다.
  • stdbuf: 파이프 통신 시 발생할 수 있는 입출력 버퍼링 정책을 조절하다.

https://ioerror.tistory.com/entry/UNIX-Linux-Command-Reference

 

UNIX & Linux Command Reference

유닉스 / 리눅스 명령어 표유닉스와 리눅스 환경에서 자주 사용되는 필수 명령어들을 완벽하게 정리한다. 서버 관리, 프로그래밍, 일상적인 시스템 운영 등 어떤 목적이든 터미널 환경을 능숙하

ioerror.tistory.com

 

반응형
Comments