[리눅스] 표준 스트림과 리다이렉션

Becoming a Data Engineer ·2023년 9월 8일
0

리눅스

목록 보기
7/9
post-thumbnail

1. 표준 스트림, Standard Streams

유닉스에서 동작하는 프로그램은 실행 시 세 개의 스트림이 자동으로 열린다. 이를 표준 스트림이라고 부른다.

이 세 개의 표준 스트림은 프로그램과 명령어 그리고 그것들이 실행되는 환경을 연결하는 통신채널이다. 스트림은 일반적으로 실행되는 터미널에 연결되지만 리다이렉션 연산자 및/또는 파이프를 사용하여 변경할 수 있다.
(참고 : 파이프)

1) 입력을 위한 스트림(Standard input, STDIN, 0)
2) 출력을 위한 스트림(Standard Output, STDOUT, 1)
3) 오류 메시지를 출력하기 위한 스트림(Standard Error, STDERR, 2)

 	standard input(0) ---> *COMMAND -----> standard output (1)
					                 |
					                 ----> standard error (2)

스트림, stream

  • 유닉스 계열 OS에서 프로그램(프로세스)과 주변 기기 사이에 연결된 '입출력 통로'
  • 표준화된 입출력 형식을 제공하는 바이트 기반의 데이터 흐름
  • 객체지향의 추상화처럼 입출력 장치들의 여러 형식에서 공통적인 기능을 추출하여 표준화된 입출력 형식을 만든 것

파일 디스크립터, File Descriptors

3개의 표준 스트림은 각각 파일 디스크립터 라는 번호가 있다.

In Linux, everything is a file. Directories, regular files, and even the devices are considered to be files. Each file has an associated number. This number is called File Descriptor or FD.

출처 : Everything You Need to Know about Linux Input-Output Redirection

표준 출력 (Standard Output, stdout, 1)

명령으로부터 비롯된 결과 (default 터미널 출력)

표준 에러 (Standard Error, stderr, 2)

명령으로부터 비롯된 에러 (default 터미널 출력)

표준 입력 (Standard Input, stdin, 0)

명령에 입력되는 데이터스트림

  • 명령어 + 입력값 (예. sort test.txt) 과 표준 입력은 다르다.
  • 명령의 표준 출력을 다른 명령의 표준 입력으로 전달해 실행하는 것도 가능하다.
[COMMAND 1] ---(stdout >> stdin)---> [COMMAND 2]

2. 리다이렉션, Redirection

리다이렉션을 이용하면 각 스트림의 '방향' 을 지정할 수 있다.

즉, 표준 입력이나 표준 출력을 꼭 키보드나 화면으로 하는 것이 아니라 방향을 바꿔서(리다이렉션) 파일로 입력을 받거나 파일로 출력하도록 변경하는 것을 말한다.

표준 출력의 리다이렉션

표준 입력을 다른 파일이나 다른 명령의 결과로 바꾸는 것

  • [COMMAND] > [FILE]
    • 명령어의 결과를 그 파일로 리다이렉션 하라고 쉘에 명령
    • 명령어의 표준 출력 스트림의 도착 지점을 파일로 설정
    • 해당 파일이 이미 존재하면 덮어쓰기
  • [COMMAND] >> [FILE]
    • 덮어쓰지 않고 이미 있는 파일에 추가해야 할 때
hyojin@computer:~/test/redirection$ ls
(---> redirection 는 현재 빈 폴더)
    
hyojin@computer:~/test/redirection$ date
Thu Aug 24 15:17:17 KST 2023
    
hyojin@computer:~/test/redirection$ date > today.txt	
(---> 1) date 명령어의 결과가 터미널에 출력되지 않고)
    
hyojin@computer:~/test/redirection$ ls
today.txt	(---> 2) 파일로 리다이렉션 되어 today.txt 가 생성된 것을 확인할 수 있음)
    
hyojin@computer:~/test/redirection$ cat today.txt
Thu Aug 24 15:17:37 KST 2023
    
hyojin@computer:~/test/redirection$ ls -l /usr/bin > list.txt       
(---> ls -l /usr/bin : 해당 폴더 안에 존재하는 수많은 실행파일 목록이 터미널에 출력됨)
(---> lits.txt 파일의 5번째 컬럼은 파일의 크기인데 현재 파일의 크기 기준으로 정렬되어 있지 x 상태)
    
hyojin@computer:~/test/redirection$ sort -k5n list.txt > sort_list.txt
   
hyojin@computer:~/test/redirection$ head -n 5 sort_list.txt
total 97048
lrwxrwxrwx 1 root root           2 Apr  8  2022 unxz -> xz
lrwxrwxrwx 1 root root           2 Apr  8  2022 xzcat -> xz
lrwxrwxrwx 1 root root           3 Jul  7 11:31 git-receive-pack -> git
lrwxrwxrwx 1 root root           3 Jul  7 11:31 git-upload-archive -> git
   
hyojin@computer:~/test/redirection$ tail -n 5 sort_list.txt
-rwxr-xr-x 1 root root     3783696 Aug 18 13:12 vim.basic
-rwxr-xr-x 2 root root     3798008 May 24 02:18 perl
-rwxr-xr-x 2 root root     3798008 May 24 02:18 perl5.34.0
-rwxr-xr-x 1 root root     5913032 Jun 11 14:26 python3.10
-rwxr-xr-x 1 root root    16138392 May 29 21:08 snap
hyojin@computer:~/test/redirection$ cat cal.txt
    
	    July 2023         August 2023       September 2023
	Su     2  9 16 23 30     6 13 20 27        3 10 17 24
	Mo     3 10 17 24 31     7 14 21 28        4 11 18 25
	Tu     4 11 18 25     1  8 15 22 29        5 12 19 26
	We     5 12 19 26     2  9 16 23 30        6 13 20 27
	Th     6 13 20 27     3 10 17 24 31        7 14 21 28
	Fr     7 14 21 28     4 11 18 25        1  8 15 22 29
	Sa  1  8 15 22 29     5 12 19 26        2  9 16 23 30
    
hyojin@computer:~/test/redirection$ date > cal.txt
    
hyojin@computer:~/test/redirection$ cat cal.txt
Thu Aug 24 15:22:01 KST 2023
hyojin@computer:~/test/redirection$ cat today.txt
Thu Aug 24 15:17:37 KST 2023
       
hyojin@computer:~/test/redirection$ date >> today.txt
       
hyojin@computer:~/test/redirection$ cat today.txt
Thu Aug 24 15:17:37 KST 2023
Thu Aug 24 15:49:50 KST 2023
hyojin@computer:~/test/redirection$ ls
cal.txt  list.txt  list_order.txt  today.txt
        
hyojin@computer:~/test/redirection$ echo "hi hello JIN!" >> greeting.txt
        
hyojin@computer:~/test/redirection$ ls
cal.txt  greeting.txt  list.txt  list_order.txt  today.txt
        
hyojin@computer:~/test/redirection$ cat greeting.txt
hi hello JIN!

표준 입력의 리다이렉션

파일로부터 입력을 받음

  • [COMMAND] < [FILE]
    • < 를 이용하면 파일을 받아서 표준 입력으로 전달한다.
  • cat line.txtcat < line.txt 는 과정은 다르지만 결과는 완전히 동일하다.
    hyojin@computer:~/test/redirection$ cat line.txt
    i
    can
    change
    the text file!
    
    hyojin@computer:~/test/redirection$ cat < line.txt
    (---> ' < ' 기호를 이용해서 line.txt의 내용을 리다이렉션을 통해 cat 명령어에 전달)
    i
    can
    change
    the text file!

표준 입력과 표준 출력을 동시에 리다이렉션

  • cat > line.txt
    • man cat 매뉴얼을 보면 'With no FILE, or when FILE is -, read standard input.'
      • 즉, 인자로 파일을 입력하지 않으면 표준 입력을 읽어 들이게 된다.
    hyojin@computer:~/test/redirection$ cat line.txt
    hi
    hello
    my name is jin
    
    hyojin@computer:~/test/redirection$ cat > line.txt	
    (---> 프롬포트가 바뀌지 않고 커서가 아래에서 반짝인다. cat이 키보드를 이용한 입력을 기다리고 있기 때문이다.)
    i
    can
    change
    the text file!
    ^C	   (---> ctrl+c 로 탈출, 프롬포트가 바뀜)
    
    hyojin@computer:~/test/redirection$ cat line.txt
    i
    can
    change
    the text file!
  • cat < original.txt > output.txt
hyojin@computer:~/test/redirection$ ls
greeting.txt  list.txt  output.txt  sort_list.txt

hyojin@computer:~/test/redirection$ cat greeting.txt
welcome hyojin!
Wed Aug 30 17:46:14 KST 2023

hyojin@computer:~/test/redirection$ cat < greeting.txt
welcome hyojin!
Wed Aug 30 17:46:14 KST 2023

hyojin@computer:~/test/redirection$ cat < greeting.txt > greeting_copy.txt

hyojin@computer:~/test/redirection$ ls
greeting.txt  greeting_copy.txt  list.txt  output.txt  sort_list.txt

hyojin@computer:~/test/redirection$ cat greeting_copy.txt
welcome hyojin!
Wed Aug 30 17:46:14 KST 2023
  • cat < date.txt >> greeting_copy.txt
hyojin@computer:~/test/redirection$ date > date.txt

hyojin@computer:~/test/redirection$ cat < date.txt >> greeting_copy.txt

hyojin@computer:~/test/redirection$ cat greeting_copy.txt
welcome hyojin!
Wed Aug 30 17:46:14 KST 2023
Wed Aug 30 18:04:05 KST 2023

표준 에러의 리다이렉션

에러를 파일로 저장해서 기록을 남기는 경우에 많이 사용

  • [COMMAND] 2> [FILE]
  • [COMMAND] 2>> [FILE]
╭─ ~/test 
╰─ ls   
color.txt  price.txt  redirection  testDir  unique.txt

╭─ ~/test 
╰─ ls top10_list.txt                                                   
ls: cannot access 'top10_list.txt': No such file or directory

╭─ ~/test 
╰─ ls top10_list.txt 2> errorlog.txt                                           

╭─ ~/test 
╰─ ls  
color.txt  errorlog.txt  price.txt  redirection  testDir  unique.txt

╭─ ~/test 
╰─ cat errorlog.txt 
ls: cannot access 'top10_list.txt': No such file or directory

╭─ ~/test 
╰─ ls top100_list.txt 
ls: cannot access 'top100_list.txt': No such file or directory

╭─ ~/test 
╰─ ls top100_list.txt 2>> errorlog.txt

╭─ ~/test
╰─ cat errorlog.txt 
ls: cannot access 'top10_list.txt': No such file or directory
ls: cannot access 'top100_list.txt': No such file or directory

표준 출력과 표준 에러를 동시에 리다이렉션

표준 출력과 표준 에러를 동시에 리다이렉션 할 때는 반드시 표준 출력부터 먼저 한다.

  • cat bees.txt ants.txt > insects.txt 2> errorlog.txt
╭─ ~/test
╰─ ls                               
color.txt  insects.txt  price.txt  redirection  testDir  unique.txt

╭─ ~/test
╰─ cat bees.txt ants.txt > insects.txt                                 
cat: bees.txt: No such file or directory
cat: ants.txt: No such file or directory

╭─ ~/test 
╰─ cat bees.txt ants.txt > insects.txt 2> errorlog.txt        

╭─ ~/test 
╰─ ls                
color.txt  errorlog.txt  insects.txt  price.txt  redirection  testDir  unique.txt

╭─ ~/test
╰─ cat errorlog.txt                               
cat: bees.txt: No such file or directory
cat: ants.txt: No such file or directory
  • 표준 에러와 표준 출력을 같은 파일에 저장할 때
    • date > output.txt 2>&1, date &> output.txt
      • date > output.txt 2> output.txt 을 간단하게 사용한 것
    • date >> output.txt 2>&1, date &>> output.txt
╭─ ~
╰─ ls -l
total 24
drwxr-xr-x  2 hyojin hyojin 4096 Aug 11 14:47 cleanUp
drwxr-xr-x 35 hyojin hyojin 4096 Sep  6 13:39 fonts
drwxr-xr-x  6 hyojin hyojin 4096 Sep  6 14:02 powerlevel10k
drwxr-xr-x  4 hyojin hyojin 4096 Sep 18 14:41 test
drwxr-xr-x  3 hyojin hyojin 4096 Aug  9 17:36 test-py-project
-rw-r--r--  1 hyojin hyojin 1523 Sep  6 14:47 vim_shortcut.txt

╭─ ~ 
╰─ date >> output.txt 2>&1

╭─ ~
╰─ cat output.txt
Mon Sep 18 15:49:47 KST 2023

╭─ ~ 
╰─ dateee >> output.txt 2>&1

╭─ ~ 
╰─ cat output.txt
Mon Sep 18 15:49:47 KST 2023
zsh: command not found: dateee

╭─ ~ 
╰─ date > output.txt 2>&1

╭─ ~ 
╰─ cat output.txt
Mon Sep 18 15:50:27 KST 2023

╭─ ~ 
╰─ ls -l 
total 28
drwxr-xr-x  2 hyojin hyojin 4096 Aug 11 14:47 cleanUp
drwxr-xr-x 35 hyojin hyojin 4096 Sep  6 13:39 fonts
-rw-r--r--  1 hyojin hyojin   29 Sep 18 15:50 output.txt
drwxr-xr-x  6 hyojin hyojin 4096 Sep  6 14:02 powerlevel10k
drwxr-xr-x  4 hyojin hyojin 4096 Sep 18 14:41 test
drwxr-xr-x  3 hyojin hyojin 4096 Aug  9 17:36 test-py-project
-rw-r--r--  1 hyojin hyojin 1523 Sep  6 14:47 vim_shortcut.txt

╭─ ~
╰─ cat output.txt
Mon Sep 18 15:50:27 KST 2023

╭─ ~ 
╰─ date &> output.txt 

╭─ ~ 
╰─ cat output.txt 
Mon Sep 18 15:58:43 KST 2023

╭─ ~ 
╰─ dateee &>> output.txt

╭─ ~ 
╰─ cat output.txt 
Mon Sep 18 15:58:43 KST 2023
zsh: command not found: dateee
profile
I want to improve more 👩🏻‍💻

0개의 댓글