시스템/기초

linux 표준 입/출력 redirection

강똥이 2019. 6. 19. 17:11

 

리눅스의 표준입력은 우리가 기본적으로 키보드를 사용해서 입력하게 되는데 이것을 표준입력이라고 할 수 있습니다.

표준 출력은 입력한 결과등을 모니터에 출력하는 것을 말합니다. 이렇게 글을 볼 수 있는것도 표준 출력의 결과라 할 수 있습니다.

리눅스는 윈도우와 같이 redirection을 사용할 수 있습니다.

 

이것을 한 문장에 넣을 수 있는데, 각각의 내용은 아래와 같이 정리해봤습니다.

0 표준 입력 : 키보드로 입력할경우 대부분 표준 입력입니다.
1 표준 출력 : 모니터에 값을 출력합니다.
2 표준 에러 : 명령에 대한 에러를 출력합니다.
a<b b의 내용을 a으로 redirection합니다.
a>b a의 내용을 b으로 redirection합니다.
a>>b a의 내용을 b으로 overriding합니다.
a<<b b의 내용을 a으로 overriding합니다.
& output을 합니다.

여기까지 대충 정리되었습니다.

 

&(output)을 단독으로 사용할 경우 백그라운드로 실행하라는 명령이 되므로 단독으로 사용할 수 없습니다.

 

먼저 간단하게 확인해보겠습니다.

redirect

확인해보면 test.txt파일이 생성된 후 ls명령의 결과를 test.txt에 넣는것을 볼 수 있습니다.

이후 계속 같은 명령을 실행해도 결과는 같습니다.

 

이번엔 '>>'를 사용해보겠습니다. 기존에 사용했던 명령에서 '>' -> '>>'로 바꾸고 실행하면 총 6줄이 되어있을겁니다. 

'>>'는 말 그대로 기존 파일 내용 아래에 추가적으로 넣는다는 것을 알 수 있습니다.

 

 

조금만 응용해보겠습니다.

'>&' 이 명령을 정리한대로 해석하자면 redirect output이됩니다. 쉽게말해 출력을 전달하는것이죠.

실제 결과가 어떻게되는지 확인해보겠습니다. 쉽게 알아보기 위해 netcat을 이용했습니다.

 

소켓 통신을 이용하여 8080/tcp를 연결하고 bash의 출력은 연결된 제 컴퓨터에 전송하게 하는 명령입니다.

 

실제로 보니 제 컴퓨터에 연결되었습니다. 하지만 명령을 쳐보니 결과가 나오지 않습니다.

생각해보면 간단합니다. 제가 키보드로 입력한 곳은 저의 컴퓨터로 소켓통신으로 연결된 곳에다가 뭘치던 실제 linux에서 아무런 조치를 취하지 않는것이됩니다.

만약 따라해 오셨다면 한번 linux에서 명령이나 아무거나 입력해보세요. 그러면 통신소켓이 연결된 곳으로 실시간으로 확인이 가능할것입니다. 또한 결과도 연결된 곳으로 이동하게되죠

이제 어떻게하면 내 pc에서 명령을 전달하고, 결과를 가져올 수 있을까요?

 

tcp통신을 통해 전달을 하게되면 그것을 표준 입력으로 redirect를 시킬 수 있어야 합니다. 동시에 결과도 받아야하죠.

제가 했던 말을 명령으로 바꿔보자면 0<&1이 될겁니다. 전달된 명령은 표준출력으로 인식합니다. 이것을 입력으로 redirect시키게하죠. 최종적으로 bash의 표준 입력이 되는겁니다.

 

그러면 다시 명령을 써보도록 하죠

 

이후 명령을 제 pc에서 입력해보면 정상적으로 명령이 입력되고, 결과가 출력될겁니다.

 

이외에도 굉장한 응용방법이 널려있습니다. 다양한 방법을 시도해보세요!