Linux에서 stdin, stdout 및 stderr이란 무엇입니까?
게시 됨: 2022-01-29 stdin
, stdout
및 stderr
은 Linux 명령을 실행할 때 생성되는 세 가지 데이터 스트림입니다. 이를 사용하여 스크립트가 파이프되고 있는지 또는 리디렉션되는지 알 수 있습니다. 우리는 당신에게 방법을 보여줍니다.
스트림이 두 점을 결합
Linux 및 Unix 계열 운영 체제에 대해 배우기 시작하자마자 stdin
, stdout
및 stederr
이라는 용어를 접하게 됩니다. 이것은 Linux 명령이 실행될 때 설정되는 세 가지 표준 스트림입니다. 컴퓨팅에서 스트림은 데이터를 전송할 수 있는 것입니다. 이러한 스트림의 경우 해당 데이터는 텍스트입니다.
물 흐름과 같은 데이터 흐름에는 두 가지 끝이 있습니다. 그들은 출처와 유출이 있습니다. 어떤 Linux 명령을 사용하든 각 스트림의 한쪽 끝을 제공합니다. 다른 쪽 끝은 명령을 실행한 셸에 의해 결정됩니다. 그 끝은 명령을 시작한 명령줄에 따라 터미널 창에 연결되거나 파이프에 연결되거나 파일 또는 다른 명령으로 리디렉션됩니다.
Linux 표준 스트림
Linux에서 stdin
은 표준 입력 스트림입니다. 이것은 텍스트를 입력으로 받아들입니다. 명령에서 셸로의 텍스트 출력은 stdout
(표준 출력) 스트림을 통해 전달됩니다. 명령의 오류 메시지는 stderr
(표준 오류) 스트림을 통해 전송됩니다.
따라서 두 개의 출력 스트림인 stdout
및 stderr
과 하나의 입력 스트림인 stdin
이 있음을 알 수 있습니다. 오류 메시지와 일반 출력은 각각 터미널 창으로 전달하는 자체 도관을 가지고 있기 때문에 서로 독립적으로 처리할 수 있습니다.
스트림은 파일처럼 처리됩니다.
거의 모든 것과 마찬가지로 Linux의 스트림은 파일처럼 취급됩니다. 파일에서 텍스트를 읽고 파일에 텍스트를 쓸 수 있습니다. 이 두 작업에는 모두 데이터 스트림이 포함됩니다. 따라서 데이터 스트림을 파일로 처리한다는 개념은 그다지 무리가 없습니다.
프로세스와 관련된 각 파일에는 식별을 위한 고유 번호가 할당됩니다. 이것을 파일 디스크립터라고 합니다. 파일에 대해 작업을 수행해야 할 때마다 파일 설명자를 사용하여 파일을 식별합니다.
이러한 값은 항상 stdin
, stdout,
및 stderr
에 사용됩니다.
- 0 : 표준입력
- 1 : 표준 출력
- 2 : 표준 오류
파이프 및 리디렉션에 반응하기
주제에 대한 소개를 쉽게 하기 위해 일반적인 기술은 주제의 단순화된 버전을 가르치는 것입니다. 예를 들어, 문법에서 규칙은 "E 앞에 I, C 뒤에 제외"입니다. 그러나 실제로는 이 규칙을 준수하는 경우보다 예외가 더 많습니다.
비슷한 맥락에서 stdin
, stdout
, stderr
에 대해 이야기할 때 프로세스가 세 가지 표준 스트림이 종료되는 위치를 알지도 못하고 신경 쓰지도 않는다는 허용된 공리를 외우는 것이 편리합니다. 프로세스는 출력이 터미널로 가는지 또는 파일로 리디렉션되는지 여부를 신경써야 합니까? 입력이 키보드에서 오는 것인지 아니면 다른 프로세스에서 파이프로 들어오는 것인지도 알 수 있습니까?
사실, 프로세스는 알고 있거나 최소한 알아낼 수 있으며, 확인을 선택하면 소프트웨어 작성자가 해당 기능을 추가하기로 결정한 경우 그에 따라 동작을 변경할 수 있습니다.
우리는 이러한 행동의 변화를 매우 쉽게 볼 수 있습니다. 다음 두 명령을 시도하십시오.
엘
엘 | 고양이
ls
명령은 출력( stdout
)이 다른 명령으로 파이프되는 경우 다르게 동작합니다. 단일 열 출력으로 전환하는 것은 ls
이며 cat
에 의해 수행되는 변환이 아닙니다. 출력이 리디렉션되는 경우 ls
는 동일한 작업을 수행합니다.
ls > capture.txt
고양이 캡처.txt
stdout 및 stderr 리디렉션
전용 스트림에서 오류 메시지를 전달하면 이점이 있습니다. 이는 명령의 출력( stdout
)을 파일로 리디렉션할 수 있으며 터미널 창에서 여전히 오류 메시지( stderr
)를 볼 수 있음을 의미합니다. 필요한 경우 오류가 발생하면 이에 대응할 수 있습니다. 또한 오류 메시지가 stdout
이 리디렉션된 파일을 오염시키는 것을 중지합니다.
다음 텍스트를 편집기에 입력하고 error.sh라는 파일에 저장합니다.
#!/bin/bash echo "존재하지 않는 파일에 접근하려고 합니다." 고양이 나쁜 파일 이름.txt
다음 명령을 사용하여 스크립트를 실행 가능하게 만드십시오.
chmod +x error.sh
스크립트의 첫 번째 줄은 stdout
스트림을 통해 터미널 창에 텍스트를 반향합니다. 두 번째 줄은 존재하지 않는 파일에 액세스를 시도합니다. 이것은 stderr
을 통해 전달되는 오류 메시지를 생성합니다.
다음 명령으로 스크립트를 실행합니다.
./오류.sh
출력 스트림 stdout
및 stderr
모두 터미널 창에 표시되었음을 알 수 있습니다.
출력을 파일로 리디렉션해 보겠습니다.
./error.sh > 캡처.txt
stderr
을 통해 전달된 오류 메시지는 여전히 터미널 창으로 전송됩니다. 파일의 내용을 확인하여 stdout
출력이 파일로 이동했는지 여부를 확인할 수 있습니다.
고양이 캡처.txt
stdin
의 출력이 예상대로 파일로 리디렉션되었습니다.
>
리디렉션 기호는 기본적으로 stdout
에서 작동합니다. 숫자 파일 설명자 중 하나를 사용하여 리디렉션하려는 표준 출력 스트림을 나타낼 수 있습니다.
stdout
을 명시적으로 리디렉션하려면 다음 리디렉션 명령어를 사용하세요.
1>
명시적으로 stderr
을 리디렉션하려면 다음 리디렉션 명령어를 사용하세요.
2>
다시 테스트해 보겠습니다. 이번에는 2>
를 사용하겠습니다.
./error.sh 2> 캡처.txt
오류 메시지가 리디렉션되고 stdout
echo
메시지가 터미널 창으로 전송됩니다.
capture.txt 파일에 무엇이 있는지 봅시다.
고양이 캡처.txt
stderr
메시지는 예상대로 capture.txt에 있습니다.
stdout 및 stderr 모두 리디렉션
확실히, stdout
또는 stderr
을 서로 독립적으로 파일로 리디렉션할 수 있다면 두 파일을 동시에 두 개의 다른 파일로 리디렉션할 수 있어야 합니까?
그래 우리는 할 수있어. 이 명령은 stdout
을 capture.txt라는 파일로, stderr
을 error.txt라는 파일로 보냅니다.
./error.sh 1> capture.txt 2> error.txt
출력 스트림(표준 출력 및 표준 오류)이 모두 파일로 리디렉션되기 때문에 터미널 창에 출력이 표시되지 않습니다. 아무 일도 일어나지 않은 것처럼 명령줄 프롬프트로 돌아갑니다.
각 파일의 내용을 확인해보자:
고양이 캡처.txt
고양이 error.txt
stdout 및 stderr을 동일한 파일로 리디렉션
좋습니다. 각각의 표준 출력 스트림이 자체 전용 파일로 이동합니다. 우리가 할 수 있는 유일한 다른 조합은 stdout
과 stderr
을 같은 파일로 보내는 것입니다.
다음 명령으로 이를 달성할 수 있습니다.
./error.sh > capture.txt 2>&1
분해해 봅시다.
- ./error.sh : error.sh 스크립트 파일을 실행합니다.
- > capture.txt :
stdout
스트림을 capture.txt 파일로 리디렉션합니다.>
는1>
의 줄임말입니다. - 2>&1 : &> 리디렉션 명령을 사용합니다. 이 명령을 사용하면 한 스트림이 다른 스트림과 동일한 대상에 도달하도록 쉘에 지시할 수 있습니다. 이 경우 우리는 "스트림 2
stderr
을 스트림 1stdout
이 리디렉션되는 동일한 대상으로 리디렉션"한다고 말합니다.
보이는 출력이 없습니다. 고무적입니다.
capture.txt 파일을 확인하고 그 안에 무엇이 들어 있는지 봅시다.
고양이 캡처.txt
stdout
및 stderr
스트림 모두 단일 대상 파일로 리디렉션되었습니다.
스트림의 출력을 리디렉션하고 자동으로 버리려면 출력을 /dev/null
로 지정합니다.
스크립트 내에서 리디렉션 감지
우리는 명령이 스트림이 리디렉션되고 있는지 감지하고 그에 따라 동작을 변경하도록 선택할 수 있는 방법에 대해 논의했습니다. 우리 자신의 스크립트에서 이것을 수행할 수 있습니까? 그래 우리는 할 수있어. 그리고 그것은 이해하고 사용하는 매우 쉬운 기술입니다.
다음 텍스트를 편집기에 입력하고 input.sh로 저장합니다.
#!/bin/bash 만약 [ -t 0 ]; 그 다음에 키보드에서 오는 echo stdin 또 다른 파이프 또는 파일에서 오는 echo stdin 파이
다음 명령을 사용하여 실행 가능하게 만드십시오.
chmod +x 입력.sh
영리한 부분은 대괄호 안의 테스트입니다. -t
(터미널) 옵션은 파일 설명자와 연결된 파일이 터미널 창에서 종료되는 경우 참(0)을 반환합니다. 우리는 stdin
을 나타내는 테스트에 대한 인수로 파일 디스크립터 0을 사용했습니다.
stdin
이 터미널 창에 연결되어 있으면 테스트가 참으로 증명됩니다. stdin
이 파일이나 파이프에 연결되어 있으면 테스트가 실패합니다.
편리한 텍스트 파일을 사용하여 스크립트에 대한 입력을 생성할 수 있습니다. 여기에서는 dummy.txt라는 파일을 사용하고 있습니다.
./input.sh < 더미.txt
출력은 스크립트가 입력이 키보드에서 오는 것이 아니라 파일에서 오는 것임을 인식한다는 것을 보여줍니다. 원하는 경우 그에 따라 스크립트의 동작을 변경할 수 있습니다.
그것은 파일 리디렉션이었습니다. 파이프로 시도해 보겠습니다.
고양이 dummy.txt | ./입력.시
스크립트는 입력이 파이프로 전달되고 있음을 인식합니다. 또는 더 정확하게는 stdin
스트림이 터미널 창에 연결되어 있지 않음을 다시 한 번 인식합니다.
파이프나 리디렉션 없이 스크립트를 실행해 보겠습니다.
./입력.시
stdin
스트림은 터미널 창에 연결되고 스크립트는 이에 따라 이를 보고합니다.
출력 스트림으로 동일한 것을 확인하려면 새 스크립트가 필요합니다. 편집기에 다음을 입력하고 output.sh로 저장합니다.
#!/bin/bash if [ -t 1 ]; 그 다음에 echo stdout은 터미널 창으로 이동합니다. 또 다른 echo stdout이 리디렉션되거나 파이프되고 있습니다. 파이
다음 명령을 사용하여 실행 가능하게 만드십시오.
chmod +x 입력.sh
이 스크립트의 유일한 중요한 변경 사항은 대괄호 안의 테스트입니다. 숫자 1을 사용하여 stdout
에 대한 파일 설명자를 나타냅니다.
시도해 봅시다. 우리는 cat
을 통해 출력을 파이프할 것입니다.
./출력 | 고양이
스크립트는 출력이 터미널 창으로 직접 이동하지 않는다는 것을 인식합니다.
출력을 파일로 리디렉션하여 스크립트를 테스트할 수도 있습니다.
./출력.sh > 캡처.txt
터미널 창에 출력이 없으며 자동으로 명령 프롬프트로 돌아갑니다. 예상대로.
캡처한 내용을 확인하기 위해 capture.txt 파일 내부를 볼 수 있습니다. 이렇게 하려면 다음 명령을 사용하십시오.
고양이 캡처.sh
다시 말하지만, 우리 스크립트의 간단한 테스트는 stdout
스트림이 터미널 창으로 직접 전송되지 않는다는 것을 감지합니다.
파이프나 리디렉션 없이 스크립트를 실행하면 stdout
이 터미널 창으로 직접 전달되고 있음을 감지해야 합니다.
./출력.sh
그것이 바로 우리가 보는 것입니다.
의식의 흐름
스크립트가 터미널 창에 연결되어 있는지, 파이프에 연결되어 있는지 또는 리디렉션되고 있는지 확인하는 방법을 알면 그에 따라 스크립트의 동작을 조정할 수 있습니다.
로깅 및 진단 출력은 화면으로 이동하는지 또는 파일로 이동하는지에 따라 다소 상세할 수 있습니다. 오류 메시지는 일반 프로그램 출력과 다른 파일에 기록될 수 있습니다.
일반적으로 더 많은 지식은 더 많은 옵션을 제공합니다.
리눅스 명령어 | ||
파일 | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · 보기 · 문자열 · 유형 · 이름 바꾸기 · zip · 압축 풀기 · 마운트 · 언마운트 · 설치 · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · 패치 · 변환 · rclone · 파쇄 · srm | |
프로세스 | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · 종료 · 재부팅 · 정지 · poweroff · passwd · lscpu · crontab · 날짜 · bg · fg | |
네트워킹 | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw |
관련: 개발자 및 열광자를 위한 최고의 Linux 노트북