Linux

6. 리디렉션과 파이프라인

Howu 2023. 4. 3. 20:49

1) 출력 리디렉션: >

  • [n]>[l] work
  • 출력 스트림을 특정 대상 파일에 저장 
    • 표준 출력 스트림 번호: 1
    • 표준 에러 스트림 번호: 2
    • 생략 시 표준 출력
  • 대상 파일이 존재하는 경우 덮어쓰기
  • noclobber 옵션 설정 시 덮어쓰기 시도 시 에러 발생
  • >| 사용시 noclobber 옵션 설정 여부와 관계없이 덮어쓰기 성공
$ ps //현재 돌아가고 있는 프로세스 확인
$ ps > result //현재 실행중인 프로세스 내용을 result 파일에 redirection 하여 보여준다.
$ ls /sdfsdfdf 2> result

2) 추가 모드 출력 리디렉션: >>

  • [n]>>word
  • 스트림을 대상 파일 끝에 저장
    • 표준 출력 스트림 번호: 1
    • 표준 에러 스트림 번호: 2
    • 생략 시 표준 출력
$ ps >> result //append 방식으로 출력

 

3) 파일 디스크립터로 리디렉션: >&

  • [n]>&[FD]
  • >과 동일하지만 `대상 파일` 대신 `대상 파일 디스크립터` 지정
  • 표준 출력과 표준 에러를 한꺼번에 출력하고 싶은 때 자주 사용
$ ls > result 2>&1 // stderr를 stdout으로 보내라

* &>

  • &>word
  • 파일 디스크립터 리디렉션 문법이 귀찮고 어렵다
  • 좀 더 편하게 사용 가능
$ ls &> result //목록 출력

 

4) 입력 리디렉션

  • [n] < word
  • 파일의 내용이 지정된 스트림(n)으로 리디렉션
  • n이 생략되면 표준 입력(fd 0)을 의미
$ wc //입력 받기
a b c d e
12345 // ctrl+D
2	6	16 //글자수, 라인수, 캐릭터수

$ wc < process.sh

 

5) Here documents: <<

[command] << [-]DELIM

 

DELIM

  • 프로그램의 표준 입력으로 multi-line string 전달
  • 코드 블록의 내용이 임시 파일로 저장됐다가 프로그램의 표준 입력이 리디렉션
  • DELIM은 다른 단어로 변경 가능 (의미상 EOF, END 등)
  • <<- 사용되면 라인 앞쪽의 tab 문자게 제거됨
$ wc << DELIM
$ cat > hellotext << EOF
$ cat hellotext

 

 

6) Here strings: <<<

  • [command] <<< word
  • Here documents의 한 줄 버전
$ cat > hellotext <<< "hello world there"
$ cat hellotext // hello world there

 

7) 파이프라인(pipeline) : |

  • 프로그램 간 상호작용
  • command1 [ | command2 ] ...
    • command1의 표준 출력이 command2의 표준 입력으로 연결됨
  • command1 [ |& command2 ] ...
    • command1의 표준 출력과 표준 에러가 command2의 표준 입력으로 연결됨
  • 각 command는 sub-shell에서 실행됨
  • 전체 파이프라인의 exit status는 마지막 실행 커맨드의 exit status임
  • pipefail 옵션이 설정되어 있다면 실패한 커맨드가 존재하면 실패로 처리됨
$ grep "root" /etc/passwd //root가 들어간 것을 찾음
$ cat /etc/passwd | grep "root //동일
$ grep "root" < /etc/passwd
$ ps -ef | grep "root" | grep "scsi"