본문 바로가기
IT Security/LINUX Basic

14. Linux - 리다이렉션(Redirection)을 이용한 표준 입출력 변환

by Rosmary 2020. 3. 3.
728x90
반응형

일전에 리눅스에 대해 포스팅하면서, vi 편집기에 대해 간략하게 설명한 적이 있다. vi에 익숙한 분들이라면, 이제 vi를 이용해 내가 원하는 문자들을 하나의 파일로 저장할 수 있게 되었을 것이다. 마치 윈도우 처음 배울 때, 메모장에 글씨 넣고 저장하는 것 연습하듯이 말이다. 

 

그런데, 리눅스를 사용하다보면 한 가지 문제점이 생긴다. 바로 원래 존재하던 파일의 내용을 복사해서 새 파일을 만들려고 하는 경우인데, 리눅스의 경우 마우스를 사용할 수 있는 환경이 아니다보니(물론 Xshell 환경은 윈도우와 유사하게 구성되어 있지만...), 파일의 내용을 긁어서 새 파일을 만드는 것에는 상당한 에러 사항이 따를 수 밖에 없다(PuTTY와 같은 원격 접속 도구를 이용하면 그나마 사용가능하긴 하지만, 아직 SSH를 사용한 원격접속에 대해 모르는 분들이라면 마우스 사용이 어려운 VM을 구동하고 있을 가능성이 클 것이고 말이다).

 

리눅스는 마우스를 사용할 수 없는 환경인 대신, 명령어와 간단한 부호만으로 파일 내용을 복사하거나, 2개 이상의 파일 내용을 중첩하여 새 파일을 만드는 것도 가능하다. 이를 가능하게 하는 것들을 리다이렉션(Redirection)이라고 부르는데, 이들은 리눅스의 입력 및 출력 방향을 전환해주는 역할을 한다. 이 말이 이해가지 않는다고 지레 겁먹지 말자. 지금부터 하나씩 살펴볼 예정이니.

 

 

1. 리눅스의 표준 입출력

 

모든 컴퓨터는 입력과 연산, 출력을 기본 프로세스로 가지고 있다. 필자가 화면에 글자를 타이핑하면, 컴퓨터는 타이핑 된(입력된) 정보를 받아 연산을 거친 뒤, 이를 화면에 내보이게(출력) 된다. 그리고 컴퓨터에 설치된 운영체제에 따라, 이 입력과 출력에 대한 표준 프로세스가 존재한다. 이를 표준 입력(Standard Input 또는 Stdin), 표준 출력 프로세스(Standard Output 또는 Stdout)라고 한다.

 

리눅스 운영체제 역시, 표준 입력 및 표준 출력 프로세스가 있다(여기에 더해 오류 출력 프로세스도 있지만 넘어가자). 표준 입력은 여러분들이 키보드로 타이핑하는 행위로 인해 컴퓨터로 정보가 입력되는 것을 말하고, 표준 출력은 입력된 명령어를 컴퓨터가 해석하고 그 내용을 화면에 나타내어 보이는 것이라고 생각하면 된다. 

 

 

위의 예시처럼, 필자는 키보드를 이용해 ls -lh라는 명령어를 입력했고, 그 결과로 ~ 폴더의 모든 내용물이 화면에 출력된다. 리눅스에서 표준 입력은 키보드를 통해 이루어지며, 표준 출력은 결과를 화면에 띄우는 것이라고 생각하면 된다.

 

 

2. 표준 출력 방향의 변환

 

리다이렉션은 표준 입력의 변환, 즉 키보드로부터의 입력이 아닌 다른 방식으로 컴퓨터에게 명령을 입력하거나, 또는 표준 출력의 변환, 화면이 아닌 다른 곳(예를 들어 새 파일 내)에 결과를 출력하도록 만들어준다. 예를 들어보자.

 

 리눅스의 echo 명령어는 명령어 뒤에 따라오는 문자열을 그대로 화면에 출력하도록 만드는 명령어이다(echo의 영어 단어 의미를 잘 생각해보자...). 만약 이 명령어 뒤에, 오른쪽 꺽쇠 한 개를 입력하고, 새로 만들 파일명을 지정하면, 저 내용은 화면이 아닌 새 파일명 내에 출력되게 된다.

 

 

그럼, 새로 만든 파일은 redirection_test.txt 파일의 내용을 열어보자. 과연 아까 입력했던 Hello라는 단어가 잘 출력될까?

 

아까 ls 명령어로 볼 수 없었던 redirection_test.txt 파일이 생성됨과 동시에, 해당 파일 내용으로 Hello가 나타나는 것을 볼 수 있다. 

 

이제 생성했던 파일에, ls -lh 의 결과값을 넣어보자. 

 

분명 cat redirection_test.txt라는 명령어를 쳤음에도 불구하고, ls -lh 명령어의 수행 결과와 동일한 내용이 파일 내에 들어가 있음을 알 수 있다(기존의 내용은 덮어쓰기 되었다. 내용 추가 방법은 뒤에서 알아본다). 이제 어렴풋이 짐작한 분들도 있겠지만, 특정 파일을 새 파일 내용으로 복사하는 것도 이와 다르지 않다. 

 

cat이나, head, tail 명령어는 파일의 내용을 화면으로 표준 출력하게 만드는 명령어다. 따라서, 이들 명령어를 리다이렉션과 함께 이용하면, 파일의 일부 또는 전체를 복사해서 새 파일로 만들거나, 기존의 파일로 덮어쓰기 할 수도 있다. 

 

 

그런데, 이 방식을 이용하면, 두 개 이상의 파일 내용을 하나의 파일로 취합하기가 매우 어려워진다. 실습을 진행해보셨다면 알겠지만, 이 방법을 이용하면, 나중에 복사하는 파일의 내용으로 덮어씌워져서 저장되기 때문이다. 내용을 추가로 기입하고 싶다면, 꺽쇠 하나가 아닌 두 개(>>)를 넣어주자. 

 

 

3. 표준 입력 방향의 변환

 

조금 비효율적인 방법이지만, 표준 입력에 대해 소개하기 위해 다음의 예시를 들어보겠다. 만약, 특정 파일 내용에서 원하는 단어가 들어가 있는 줄만 찾기 위해서는 | grep 명령어를 사용한다. 지금까지는 다음과 같이 명령어를 작성하여 원하는 내용이 들어간 행을 출력해왔다. 

 

 

cat redirection_test.txt는 표준 출력과 관련된 내용이다. 필자는 저 파일의 내용을 cat으로 입력하여, grep으로 출력해보려고 한다. 

 

사실, 표준 입력과 관련된 리다이렉션은 스크립트(코딩)에서 많이 쓰인다. 

키보드로 cat redirection_test.txt를 입력받는게 아니라, 파일 내용 자체를 입력받고 이를 cat으로 처리하도록 만든 프로세스라고 생각하면 된다. 필자가 위의 그림 밑에서도 언급했듯이, 파일 내용을 확인하기 위해 표준 입력 리다이렉션을 사용하는 일은 아예 없다고 보면 된다. 

 

표준 출력과 마찬가지로, 표준 입력 역시, 왼쪽 꺽쇠가 2개면, 추가로 입력하는 글자에 대해 명령어 수행이 가능하다. 다만, 이는 파일의 내용에 추가하여 입력하는 것이 아니라, 사용자로부터 입력받는 내용에 한해서만 cat 명령어를 수행한다.

 

">" 표시에서 작성이 끝나면 Enter를 치고, Ctrl + d를 눌러주면 된다.

 

분명 redirection_test.txt 역시 << 로 명령어를 수행하도록 했지만, 결과는 새로 입력한 내용만 적용된다. 표준 입력 리다이렉션 << 역시 사실 파일의 내용을 살펴보기 위한 용도로는 아예 사용되지 않고(cat과 head와 여러 좋은 명령어가 있는데 굳이 사용할 이유가 없다), 스크립트에서 타 프로그래밍 언어의 소스를 입력하기 위한 용도로 많이 사용한다. 다음의 예시를 보자.

 

cat << EOF 명령어는, 새로 입력받는 문자열들에 대해 EOF(End of File)가 나타날때까지 입력을 받고, 입력이 종료(EOF가 입력)되면, 내용을 출력하라는 의미다. EOF 대신 다른 단어를 넣더라도 동일한 결과가 나타난다.

 

 

리눅스는 기본적으로 Python 언어를 사용할 수 있는 환경을 제공한다. 따라서, 표준 입력 리다이렉션 <<을 사용하면 필자가 다음과 같이 Python 코드를 짜서 구동시키는 것도 가능하다.

 

 

리다이렉션이 여러 개 사용된 경우(위와 같이), 연산 순서는 다음과 같다. cat << EOF > hello.py에서 우선 cat << EOF 가 가장 먼저 실행된다. 따라서 사용자로부터 EOF가 입력될때까지 내용을 일시적으로 기억한 뒤, EOF가 입력되면 기억한 내용을 새 파일 hello.py로 저장하게 된다. py확장자가 붙은 파일이기 때문에, python 명령어로 실행하면 위의 그림처럼 hello, world라는 문구가 출력되게 된다. 


사실, 리눅스의 리다이렉션 기능은, 리눅스 스크립트를 작성하지 않는다면 거의 쓸 일이 없는 기능이긴 하다. 단순히 리눅스를 개인 서버 용도로만 사용할 뿐, 시스템 개선 스크립트를 작성하지 않는다면, 사실 배워놓더라도 잘 잊어버리게 된다. 따라서, 이번 포스팅을 참고하시는 분들은, "아, 이런 기능도 리눅스에서 제공하는구나" 정도로 기억만 하고 나중에 스크립트를 접한 뒤, 본 포스팅을 참고하여 리다이렉션을 많이 사용해보는 것이 훨씬 도움이 될 것이다.

 

 

FIN.

반응형

댓글