유닉스에서 동작하는 프로그램은 실행 시 세 개의 스트림이 자동으로 열린다. 이를 표준 스트림이라고 부른다.
이 세 개의 표준 스트림은 프로그램과 명령어 그리고 그것들이 실행되는 환경을 연결하는 통신채널이다. 스트림은 일반적으로 실행되는 터미널에 연결되지만 리다이렉션 연산자 및/또는 파이프를 사용하여 변경할 수 있다.
(참고 : 파이프)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)
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
명령으로부터 비롯된 결과 (default 터미널 출력)
명령으로부터 비롯된 에러 (default 터미널 출력)
명령에 입력되는 데이터스트림
sort test.txt
) 과 표준 입력은 다르다.[COMMAND 1] ---(stdout >> stdin)---> [COMMAND 2]
리다이렉션을 이용하면 각 스트림의 '방향' 을 지정할 수 있다.
즉, 표준 입력이나 표준 출력을 꼭 키보드나 화면으로 하는 것이 아니라 방향을 바꿔서(리다이렉션) 파일로 입력을 받거나 파일로 출력하도록 변경하는 것을 말한다.
표준 입력을 다른 파일이나 다른 명령의 결과로 바꾸는 것
- [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.txt
와 cat < 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
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