본문 바로가기
IT/LINUX

리눅스 표준입력 표준출력 표준에러

by SidePower 2020. 9. 18.

모르거나 애매하게 알고 있다가 지적당하면 은근히 자존심 상하는거 같아요.^^;;

 

개념 꼭 알고 있으세요. 

 

리눅스에서는 프로그램이나 쉘스크립트 등이
실행되면 프로세스가 됩니다.


프로세스가 생기면 자동으로 프로세스 관리 테이블이 생깁니다.
또 자동으로 3개의 파일 디스크립터도 같이 생깁니다.


이때 자동으로 생기는 파일 디스크립터가 바로
표준입력,표준출력,표준에러 입니다.

디스크립터란 사전 의미로 색인 또는 인덱스입니다.

뭔가를 찾기 위한 key 라고 생각하시면 될거에요.

 

파일 디스크립터란 두가지 의미가 있습니다.

첫번째는 파일을 가리키는 0이 아닌 정수 번호입니다.

두번째는 프로세스가 접근하는 파일에 대한 관리 테이블의 인덱스입니다.

 

꼭 아셔야 되는게 바로 리눅스 환경은 다 파일입니다.

일반적인 텍스트파일은 말할것도 없고요 디렉토리도 파일입니다.

프로세스도 파일이고 통신 하는 소켓도 파일 , LAN 카드도 파일이고 

디스크도 파일이고 등등등.... 다 파일입니다.

특수한 파일을 만들어 그 파일과 연결되어 있다는 얘기입니다.

그 파일에 접근하면 그 장치에 접근하는것이고

그 파일에 명령어를 보내면 그 장치가 명령어를 받아들어서 처리하고 결과를 보내줍니다.

그 파일에 접근하는 방법이 바로 파일 디스크립터 개념을 이용한 방법으로

파일(=장치)마다 번호(디스크립터)를 부여해서 리눅스 시스템이 돌아갑니다.

 

 

표준 입력,표준 출력,표준 에러는 동일하게 파일 디스크립터가 지정되며 

아래 표로 간단하게 정리했습니다.

의미 파일 디스크립터 디폴트 장치 리다이렉션 기호 표준 스트림 이름 POSIX 상수 이름
표준 입력 0 키보드 < stdin STDIN_FILENO
표준 출력 1 모니터 > or >> stdout STDOUT_FILENO
표준 에러 2 모니터 > or >> stderr STDERR_FILENO

근데 이걸로 뭘 할까요?

 

표준입력 0 은 명령어나 프로그램에 실행에 필요한 입력값을 받는 통로같은 역할입니다.

디폴트 장치가 키보드인데요. 

키보드를 통한 표준입력의 쉬운 예로 디렉토리의 정보를 보고 싶을때

ls 명령어를 실행할려고 프롬프트에 ls 영문자를 키보드 쳐서 표시하고 엔터키를 누르면 되잖아요.

ls 키보드 친게 표준입력이고 디렉토리 정보가 모니터에 표시되는게 표준출력입니다.

간단하조.

 

리다이렉션 < 으로 표준입력값을 다른곳에 사용할수 있습니다.

cat 명령어는 파일의 내용을 모니터에 표시하는 명령어입니다.

cat 수행할려면 파일명을 알려줘야 됩니다. 이것을 표준입력으로 알려주고

cat 수행해서 파일 내용을 표준출력인 모니터로 표시합니다.

 

표준출력 1 은 위의 예로 충분하겠조. ㅋ

명령어 실행시 기본 장치인 모니터로 결과값이 보여집니다.

그리고 리다이렉션 > 로도 표준출력값을 원하는 곳으로 사용할수 있습니다.

파일의 내용을 읽어서 다른 파일로 저장할때도 사용할수 있습니다.

 

위는 cat 을 통해 표준입력 < 과 표준출력 > 을 같이 이용하는 예입니다.

cat 의 출력값을 모니터에 표시하지 않고 > 를 이용해서

새로운 파일(STDOUT.txt) 을 만드는데 이용한거에요.

 

원리는

처음 실행하는 명령어나 프로그램의 입력값을 대입하고 (표준입력 <)

처음 실행한 명령어의 출력값이 (표준출력 >)

뒤에 실행할 명령어의 입력값으로 사용되는것입니다.

 

이처럼 표준입력,표준출력 그리고 표준에러를 다른곳으로

이용하는면에서는 리다이렉션과는 뗄래야 뗄 수 없는 관계입니다.

 

표준 에러 2 는 명령어나 프로그램 실행시 발생하는 에러입니다.

기본 장치인 모니터로 표시됩니다.

위를 보시면 존재하지 않는 디렉토리 ( FOLD )를 사용할려합니다.

표준에러가 발생해서 모니터에 표시됐네요.

=> bash: cd: FOLD: 그런 파일이나 디렉터리가 없습니다.

이 표준에러 2를 보지 않아도 되면 위 처럼 리다이렉션 > 를 이용해 /dev/null 로 보냅니다.

에러가 화면에 표시되지 않는걸 볼수 있을거에요.

 

그리고 2>/dev/null은 crontab 설정할때 많이 사용되더라구요.

 

다음에는 crontab에 대해서 포스트할게요.

 

감사합니다.

반응형

댓글