Linux에서 stdin, stdout 및 stderr은 무엇입니까?

stdin, stdout그리고 stderr당신이 리눅스 명령을 실행할 때 생성 된 스트림 세 개의 데이터이다. 이를 사용하여 스크립트가 파이프되거나 리디렉션되는지 여부를 알 수 있습니다. 방법을 보여드립니다.

스트림은 두 포인트를 결합

즉시 당신이 리눅스에 대해 배울 시작으로 유닉스와 같은 운영 체제, 당신은 용어 건너거야 stdin, stdout하고 stederr. 이는 Linux 명령이 실행될 때 설정되는 세 가지 표준 스트림입니다. 컴퓨팅에서 스트림은 데이터를 전송할 수있는 것입니다. 이러한 스트림의 경우 해당 데이터는 텍스트입니다.

물 흐름과 같은 데이터 흐름에는 두 개의 끝이 있습니다. 그들은 소스와 유출이 있습니다. 사용중인 Linux 명령이 각 스트림의 한쪽 끝을 제공합니다. 다른 쪽 끝은 명령을 시작한 셸에 의해 결정됩니다. 이 끝은 명령을 시작한 명령 줄에 따라 터미널 창에 연결되거나 파이프에 연결되거나 파일 또는 다른 명령으로 리디렉션됩니다.

Linux 표준 스트림

Linux에서는  stdin표준 입력 스트림입니다. 텍스트를 입력으로받습니다. 명령에서 쉘로의 텍스트 출력은 stdout(표준 출력) 스트림을 통해 전달됩니다 . 명령의 오류 메시지는 stderr(표준 오류) 스트림을 통해 전송됩니다 .

따라서 두 개의 출력 스트림 stdoutstderr, 하나의 입력 스트림, stdin. 오류 메시지와 정상 출력에는 각각 터미널 창으로 전달하는 고유 한 도관이 있기 때문에 서로 독립적으로 처리 할 수 ​​있습니다.

스트림은 파일처럼 처리됩니다.

Linux의 스트림은 거의 모든 것과 마찬가지로 파일 인 것처럼 처리됩니다. 파일에서 텍스트를 읽을 수 있고 파일에 텍스트를 쓸 수 있습니다. 이 두 작업에는 데이터 스트림이 포함됩니다. 따라서 데이터 스트림을 파일로 처리하는 개념은 그리 어렵지 않습니다.

프로세스와 연관된 각 파일에는이를 식별하기위한 고유 번호가 할당됩니다. 이를 파일 설명 자라고합니다. 파일에서 작업을 수행해야 할 때마다 파일 설명자가 파일을 식별하는 데 사용됩니다.

이러한 값은 stdin, stdout,및에 항상 사용됩니다 stderr.

  • 0 : 표준 입력
  • 1 : 표준 출력
  • 2 : 표준

파이프 및 리디렉션에 대한 반응

다른 사람의 주제 소개를 쉽게하기 위해 일반적인 기술은 주제의 단순화 된 버전을 가르치는 것입니다. 예를 들어 문법에서는 규칙이 "I 이전에, C 이후를 제외하고"라고 들었습니다. 그러나 실제로이 규칙을 준수하는 경우보다이 규칙에 더 많은 예외가 있습니다.

비슷한 맥락에서, 약 이야기 할 때 stdin, stdout그리고 stderr 프로세스가 알고이나 그 세 개의 표준 스트림이 종료됩니다 걱정 둘 것을 허용 공리를 트로트 편리합니다. 프로세스가 출력이 터미널로 이동하는지 또는 파일로 리디렉션되는지 여부에 관심을 가져야합니까? 입력이 키보드에서 오는지 또는 다른 프로세스에서 파이프로 연결되는지조차 알 수 있습니까?

실제로 프로세스는 알고 있거나 확인하기로 선택하면 최소한 알 수 있으며 소프트웨어 작성자가 해당 기능을 추가하기로 결정하면 그에 따라 동작을 변경할 수 있습니다.

우리는 이러한 행동 변화를 매우 쉽게 볼 수 있습니다. 다음 두 명령을 시도하십시오.

ls

ls | 고양이

ls명령 행동한다 다르게 경우 그 출력 ( stdout) 명령에 다른 파이프되고있다. 그것은 인  ls하나의 열 출력 스위치는,이 변환에 의해 수행되는 것이 아니다 cat. 그리고 ls출력이 리디렉션되는 경우 같은 일을 :

ls> capture.txt

고양이 capture.txt

stdout 및 stderr 리디렉션

전용 스트림에서 오류 메시지를 전달하면 이점이 있습니다. 이는 명령의 출력 ( stdout)을 파일로 리디렉션 stderr하고 터미널 창에서 오류 메시지 ( )를 볼 수 있음을 의미합니다. 필요한 경우 오류가 발생하면 이에 대응할 수 있습니다. 또한 stdout리디렉션 된 파일을 오염시키는 오류 메시지를 중지합니다 .

다음 텍스트를 편집기에 입력하고 error.sh라는 파일에 저장하십시오.

#! / bin / bash echo "존재하지 않는 파일에 접근하려고합니다."cat bad-filename.txt

다음 명령을 사용하여 스크립트를 실행 가능하게 만듭니다.

chmod + x error.sh

스크립트의 첫 번째 줄은 stdout스트림을 통해 텍스트를 터미널 창에 표시  합니다. 두 번째 줄은 존재하지 않는 파일에 액세스하려고합니다. 를 통해 전달되는 오류 메시지가 생성됩니다 stderr.

다음 명령으로 스크립트를 실행하십시오.

./error.sh

출력 스트림 stdoutstderr, 모두 터미널 창에 표시되었음을 알 수 있습니다.

출력을 파일로 리디렉션 해 보겠습니다.

./error.sh> capture.txt

를 통해 전달되는 오류 메시지 stderr는 여전히 터미널 창으로 전송됩니다. 파일의 내용을 확인하여 stdout 출력이 파일로 이동했는지 확인할 수 있습니다.

고양이 capture.txt

의 출력 stdin이 예상대로 파일로 리디렉션되었습니다.

>리디렉션 기호와 함께 작동 stdout기본적으로. 숫자 파일 설명자 중 하나를 사용하여 리디렉션 할 표준 출력 스트림을 나타낼 수 있습니다.

명시 적으로 리디렉션하려면  stdout다음 리디렉션 명령어를 사용하세요.

1>

명시 적으로 리디렉션하려면  stderr다음 리디렉션 명령어를 사용하세요.

2>

다시 테스트 해 보겠습니다 2>. 이번에는 다음을 사용합니다 .

./error.sh 2> capture.txt

오류 메시지가 리디렉션되고 stdoutecho메시지가 터미널 창으로 전송됩니다.

capture.txt 파일에 무엇이 있는지 봅시다.

고양이 capture.txt

stderr예상대로 메시지가 capture.txt입니다.

stdout 및 stderr 모두 리디렉션

확실히 우리가 서로 독립적으로 stdout또는 stderr파일로 리디렉션 할 수 있다면 두 파일을 동시에 두 개의 다른 파일로 리디렉션 할 수 있어야합니까?

응 우리는 할 수있어. 이 명령은 stdoutcapture.txt 파일과 stderrerror.txt 파일로 지정됩니다.

./error.sh 1> capture.txt 2> error.txt

출력 스트림 (표준 출력 및 표준 오류)이 모두 파일로 리디렉션되기 때문에 터미널 창에 표시되는 출력이 없습니다. 아무 일도 발생하지 않은 것처럼 명령 줄 프롬프트로 돌아갑니다.

각 파일의 내용을 확인해 보겠습니다.

고양이 capture.txt
고양이 error.txt

stdout 및 stderr을 동일한 파일로 리디렉션

깔끔한 데, 각각의 표준 출력 스트림이 전용 파일로 이동합니다. 우리가 할 수있는 유일한 다른 조합은 모두를 보내는 것입니다 stdoutstderr같은 파일에.

다음 명령으로이를 수행 할 수 있습니다.

./error.sh> capture.txt 2> & 1

그것을 분해합시다.

  • ./error.sh : error.sh 스크립트 파일을 시작합니다.
  • > capture.txt : stdout스트림을 capture.txt 파일로 리디렉션 합니다. >1>.
  • 2> & 1 : &> 리디렉션 명령을 사용합니다. 이 명령어를 사용하면 한 스트림이 다른 스트림과 동일한 대상에 도달하도록 셸에 지시 할 수 있습니다. 이 경우 "스트림 2,, stderr스트림 1 stdout이 리디렉션되는 동일한 대상 으로 리디렉션"이라고 말합니다.

가시적 인 출력이 없습니다. 그것은 고무적입니다.

capture.txt 파일을 확인하고 그 안에 무엇이 있는지 살펴 보겠습니다.

고양이 capture.txt

stdoutstderr스트림 모두 단일 대상 파일로 리디렉션되었습니다.

스트림의 출력을 리디렉션하고 자동으로 버리려면 출력을 /dev/null.

스크립트 내에서 리디렉션 감지

우리는 명령이 어떤 스트림이 리디렉션되고 있는지 감지하고 그에 따라 동작을 변경하도록 선택할 수있는 방법에 대해 논의했습니다. 자체 스크립트에서이를 수행 할 수 있습니까? 응 우리는 할 수있어. 그리고 이것은 이해하고 사용하기 매우 쉬운 기술입니다.

다음 텍스트를 편집기에 입력하고 input.sh로 저장합니다.

#! / bin / bash if [-t 0]; 그런 다음 키보드에서 오는 echo stdin 그렇지 않으면 파이프 또는 파일에서 오는 echo stdin fi

다음 명령을 사용하여 실행 가능하게 만드십시오.

chmod + x input.sh

영리한 부분은 대괄호 안의 테스트입니다. -t(0)가 true (터미널) 옵션을 반환하는 경우 터미널 창에서 파일 기술자 종료와 관련된 파일. 파일 설명자 0을 테스트에 대한 인수로 사용했습니다   stdin.

stdin가 터미널 창에 연결되어 있으면 테스트가 사실임을 증명합니다. stdin파일 또는 파이프에 연결되어 있으면 테스트가 실패합니다.

편리한 텍스트 파일을 사용하여 스크립트에 대한 입력을 생성 할 수 있습니다. 여기서는 dummy.txt라는 이름을 사용합니다.

./input.sh <dummy.txt

출력은 스크립트가 입력이 키보드에서 오는 것이 아니라 파일에서 오는 것을 인식한다는 것을 보여줍니다. 선택한 경우 그에 따라 스크립트의 동작을 변경할 수 있습니다.

파일 리디렉션을 사용 했으므로 파이프로 시도해 봅시다.

고양이 dummy.txt | ./input.sh

스크립트는 입력이 파이프되어 있음을 인식합니다. 보다 정확하게는 stdin스트림이 터미널 창에 연결되어 있지 않음을 다시 한 번 인식 합니다.

파이프 나 리디렉션없이 스크립트를 실행 해 보겠습니다.

./input.sh

stdin스트림은 터미널 창에 연결하고 스크립트가 따라이를보고있다.

출력 스트림으로 동일한 것을 확인하려면 새 스크립트가 필요합니다. 다음을 편집기에 입력하고 output.sh로 저장합니다.

#! / bin / bash if [-t 1]; 그런 다음 echo stdout이 터미널 창으로 이동하고 그렇지 않으면 echo stdout이 리디렉션되거나 파이프됩니다.

다음 명령을 사용하여 실행 가능하게 만드십시오.

chmod + x input.sh

이 스크립트에 대한 유일한 중요한 변경 사항은 대괄호 안에있는 테스트입니다. 에 대한 파일 설명자를 나타내는 데 숫자 1을 사용하고 stdout있습니다.

시도해 봅시다. 출력을 cat.

./ 출력 | 고양이

스크립트는 출력이 터미널 창으로 직접 이동하지 않음을 인식합니다.

출력을 파일로 리디렉션하여 스크립트를 테스트 할 수도 있습니다.

./output.sh> capture.txt

터미널 창에 출력이 없으며 명령 프롬프트로 자동으로 돌아갑니다. 예상대로.

capture.txt 파일에서 무엇이 캡처되었는지 확인할 수 있습니다. 이렇게하려면 다음 명령을 사용하십시오.

고양이 capture.sh

다시 말하지만, 스크립트의 간단한 테스트는 stdout스트림이 터미널 창으로 직접 전송되지 않음을 감지합니다 .

파이프 나 리디렉션없이 스크립트를 실행 stdout하면 터미널 창으로 직접 전달되는 것을 감지해야합니다 .

./output.sh

이것이 바로 우리가 보는 것입니다.

의식의 흐름

스크립트가 터미널 창이나 파이프에 연결되어 있는지 또는 리디렉션되고 있는지 확인하는 방법을 알면 그에 따라 동작을 조정할 수 있습니다.

로깅 및 진단 출력은 화면으로 이동하는지 파일로 이동하는지에 따라 다소 자세 할 수 있습니다. 오류 메시지는 일반 프로그램 출력과 다른 파일에 기록 될 수 있습니다.

일반적으로 그렇듯이 지식이 많을수록 더 많은 옵션이 제공됩니다.