Redirection / Pipe

정승균·2020년 12월 10일
0

리눅스

목록 보기
8/29
post-thumbnail
post-custom-banner

Ⅰ. cat


  • $ cat file : 파일을 Stdout으로 출력
  • 파일을 지정하지 않을 경우 Stdin을 받음
jsg@jsg-ubuntu:~$ cat testdir/hello.txt
Hello World
jsg@jsg-ubuntu:~$ cat
writing input
writing input

Ⅱ. tee


  • $ tee file : stdin을 stdout 과 파일에 연결
jsg@jsg-ubuntu:~$ echo tee demonstration | tee redirection.txt
tee demonstration
jsg@jsg-ubuntu:~$ cat redirection.txt
tee demonstration

Ⅲ. Redirection


  • 채널의 방향을 파일로 연결

1. A > File

  • A의 stdout을 file로 연결
  • A 가 null command(":", 생략 가능) File이 clear됨
jsg@jsg-ubuntu:~$ (date && errorcommand) > redirection.txt
errorcommand: 명령을 찾을 수 없습니다
jsg@jsg-ubuntu:~$ cat redirection.txt 
2020. 12. 18. (금) 18:33:54 KST
jsg@jsg-ubuntu:~$ : > redirection.txt
jsg@jsg-ubuntu:~$ cat redirection.txt 
jsg@jsg-ubuntu:~$ 

2. A n> File

  • A의 n번 fd를 파일로 연결
jsg@jsg-ubuntu:~$ (date && errorcommand) 2> redirection.txt
2020. 12. 18. (금) 18:35:26 KST
jsg@jsg-ubuntu:~$ cat redirection.txt 
errorcommand: 명령을 찾을 수 없습니다

3. A &> File

  • A의 stdout과 stderr를 File로 연결
jsg@jsg-ubuntu:~$ (date && errorcommand) &> redirection.txt
jsg@jsg-ubuntu:~$ cat redirection.txt 
2020. 12. 18. (금) 18:38:00 KST
errorcommand: 명령을 찾을 수 없습니다

4. A n>&m

  • A의 n번fd를 파일대신 m번fd로
jsg@jsg-ubuntu:~$ cat test.sh
#! bin/bash
echo Error >&2
jsg@jsg-ubuntu:~$ bash test.sh > /dev/null
Error

5. A >> File

  • A > B 와 같지만 덮어쓰는 대신 추가
jsg@jsg-ubuntu:~$ echo "Appended text" >> redirection.txt 
jsg@jsg-ubuntu:~$ cat redirection.txt 
2020. 12. 18. (금) 18:38:00 KST
errorcommand: 명령을 찾을 수 없습니다
Appended text

6. A < File

  • A의 stdin을 File에 연결
jsg@jsg-ubuntu:~$ cat < redirection.txt 
2020. 12. 18. (금) 19:09:42 KST

7. A <$n

  • n번 fd를 A의 stdin으로

6. A << HERE

  • 다음 HERE가 나올때까지 모든 input을 A로 전달
jsg@jsg-ubuntu:~$ cat << HERE
sentences
more sentences
HERE
sentences
more sentences

4. A <<< text

  • A의 stdin을 text에 연결
jsg@jsg-ubuntu:~$ cat <<< redirection.txt
redirection.txt

Ⅵ. Pipe


  • 프로세스간의 단방향 통신을 할 수 있게 함

1. A | B

  • A의 출력 -> B의 입력으로 연결됨
  • A가 종료되야지 B로 연결
jsg@jsg-ubuntu:~$ ls | wc -l	   # ls 에서 받은 출력값을 입력값으로 받아 count함
11

2. A > >(B)

  • A | B 와 비슷하지만 A가 종료상태가 아니여도 잘만 돌아감
jsg@jsg-ubuntu:~$ cat test.sh
#! /bin/bash
while :
do
	sleep 5
	echo Good $(date)
	echo Err $(date) >&2
done

jsg@jsg-ubuntu:~$ cat log.sh
#! /bin/bash
while read line
do
	if [ $1 == ERR ]
	then
		echo $line >> err.txt
	else
		echo $line >> log.txt
	fi
done

jsg@jsg-ubuntu:~$ ./test.sh > >(./log.sh NOR) 2> >(./log.sh ERR) &
[1] 29207
jsg@jsg-ubuntu:~$ cat log.txt
Good 2020. 12. 18. (금) 21:10:00 KST
jsg@jsg-ubuntu:~$ cat err.txt
Err 2020. 12. 18. (금) 21:10:00 KST
Err 2020. 12. 18. (금) 21:10:05 KST

4. named pipe

  • 파일 형태로 볼 수 있음
  • $ mkfifo pipe_name 로 생성
# terminal 1
jsg@jsg-ubuntu:~$ mkfifo myfifo
jsg@jsg-ubuntu:~$ ls -l myfifo
prw-rw-r-- 1 jsg jsg 0 Dec 10 20:45 myfifo
jsg@jsg-ubuntu:~$ cat testdir/hello.txt > myfifo

# terminal 2
jsg@jsg-ubuntu:~$ cat myfifo
Hello World

Ⅴ. 잡지식


1. noclobber

  • set -o noclobber 로 덮어쓰기를 방지할 수 있다
  • >|으로 force 가능
jsg@jsg-ubuntu:~$ set -o noclobber
jsg@jsg-ubuntu:~$ echo Rewrite > redirection.txt 
bash: redirection.txt: cannot overwrite existing file
jsg@jsg-ubuntu:~$ echo Rewrite >| redirection.txt 
jsg@jsg-ubuntu:~$ cat redirection.txt
Rewrite

2. code block

  • 중괄호를 code block으로 사용가능
jsg@jsg-ubuntu:~$ {
echo Date is ....
date
} > redirection.txt 
jsg@jsg-ubuntu:~$ cat redirection.txt
Date is ....
2020. 12. 18. (금) 21:30:09 KST
post-custom-banner

0개의 댓글