상세 컨텐츠

본문 제목

42 Seoul 대비 리눅스 공부 (생활코딩 - IO Redirection)

리눅스/리눅스 기초

by Banjosh 2023. 1. 26. 11:53

본문

  • Output

  ls -l을 입력하면 화면에 결과값이 출력된다. 만약 이 결과값을 화면에 출력하는게 아닌 .txt파일에 저장하고 싶으면 어떻게 해야할까? 화면에 출력된 결과값을 복사해서 nano 에디터를 이용해 파일을 만드는 법도 있겠지만, ls -l > result.txt 한줄로 쉽게 결과값을 파일에 저장할 수 있다. 이렇게 화면으로 출력되는 결과값을 파일로 저장하게 만드는 것처럼 출력되는 방향을 바꾸는 것을 Redirection이라 한다.

 위 내용에서 ls -l처럼 화면에 결과값을 출력하는 방식을 Standard Output이라 한다. Standard Output은 기본적으로 모니터에 결과값이 출력되는 방식을 말하고 Standard Output 명령어 뒤에 > 혹은 1>를 입력하고 그 뒤에 파일 이름을 적으면 결과값을 Redirection 시켜 파일에 저장할 수 있다. 이 예시중 하나가  위에서 본 ls -l > result.txt이다.(ls -l이 Standard Output방식이고 이 결과 값을 result.txt 파일에 저장)

 모든 프로그램이 항상 Standard Output의 출력을 하는 것은 아니다. 만약 프로그램에 오류가 있을 때는 터미널에 에러 메세지가 출력되게 된다. 이때 출력방식을 Standard Error라 하고 이는 > 또는 1> 로 Redirection을 시킬 수 없다.  1> 이 의미하는 것은 Standard Output을 Redirection한다는 뜻이므로 Standard Error는 2>를 이용하여 Redirection 해줘야 한다. 예를들면 현재 디렉토리에 example.txt라는 파일이 없을 때 rm example.txt를 입력하면 에러 메세지가 뜬다. 이는 Standard Error방식의 결과값을 화면에 출력하므로 rm example.txt 2> error.log 를 이용해 에러 메세지를 error.log 파일 안에 저장해야 한다. 

 따라서 어떠한 프로그램을 실행할 때 에러가 발생할지 안할지 모르겠다면 rm example.txt 1> result.txt 2> error.log 와 같이 처리를 해줄 수 있고, 이는 Standard Output이 나오면 result.txt에 Standard Error가 나오면 error.log에 결과값을 저장하게 하는 명령어이다.(실행 결과 result.txt와 error.log가 모두 생성되지만 결과값이 Standard Output이면 error.log는 빈파일이 되고, Standard Error면 result.txt가 빈파일이 된다)

  • Input

 가장 기본적인 Input에는 Command-line Arguments가 있다. ls -al 에서 -al가 ls라는 프로그램에  Command-line Arguments로 입력된 예시 중 하나이고, 이렇게 프로그램이 실행될 때 전달되는 입력값을 Command-line Arguments라 부른다. 

  Standard Input은 프로그램이 받는 사용자가 키보드로 입력한 기본값을 의미한다. 즉 cat을 입력하고 키보드로 아무거나 입력을하면 그 내용 그대로 출력하는 것을 볼 수 있는데 이때 우리가 입력하는 값이 Standard Input이다. Standard Input에서도 Redirection이 가능한데 우리가 키보드로 입력하는 값을 Input으로 하는게 아닌 파일의 내용을 Input으로 하는 방법이다. 만약 hello.txt가 있고 이 파일의 내용이 hello인 경우 cat < hello.txt를 실행한 경우 hello가 출력된다. 이는 hello.txt를 < 를 이용해 Redirection한 것이고, 키보드 입력값 대신 파일의 내용을 Standard Input으로 이용한 경우이다. 그러면 우리가 계속 써오던 cat hello.txt와 무엇이 다른 걸까? cat이라는 명령어는 Standard Input을 Input으로 받을 수 있지만 Command-line Arguments를 input으로 받을 수도 있다. cat < hello.txt에서는 hello.txt를 Standard Input으로 받은 것이고, cat hello.txt에서는 hello.txt를 Command-line Arguments로 받은 것이다.

  근데 우리가 지금까지 <를 이용해서 명령어를 쓴 경험이 많이 없는 것처럼 Standard Input은 사실 잘 사용하지 않는 input방식이므로 중요한 개념은 아니다. (우리가 계속 주던 input값은 거의 Command-line Arguments 방식)

 

  위의 내용을 종합해서 < 와 > 를 이용한 입,출력도 가능하다. 만약 linux.txt라는 파일이 수백줄로 이루어져있고 여기서 첫번째 줄만 one.txt에 저장하고 싶은 경우를 보자. head -n1 < linux.txt는 linux.txt의 내용중 첫번쨰 줄만 화면에 출력하는 명령어이다. 이를 head -n1 < linux.txt > one.txt 로 바꾸면 linux.txt라는 파일의 내용을 Standard Input으로 주고 head -n1이 내용중 첫째 줄을 Standard Output으로 하는데 이를 화면에 출력하지 않고 one.txt에 저장하라는 명령어이다. 

 

  • append

  위의 > 를 이용한 파일 내용 저장방법은 덮어쓰기 방법이다. 만약 ls -l > now.txt를 하면 cat now.txt의 출력값은 ls -l의 출력값이 나오고, 그 상태 그대로 ls -al > now.txt를 하면 cat now.txt의 출력값은 ls -al의 출력값이 나온다. 즉 ls -al > now.txt를 한 순간 원래 있던 ls -l의 내용이 삭제되고 ls -al의 내용이 저장된다는 것이다. 그러면 만약 ls -l의 값이 저장되어있는 now.txt에 ls -al의 값을 이어서 저장하고 싶으면 어떻게 해야할까? 그때 사용하는 것이 append 기능인 >> 이다. ls -l > now.txt를 하고 ls -al >> now.txt를 하면 >> 가 이어쓰기 기능이므로 ls -l와 ls -al이 연속되어 now.txt에 기록된다.

 반대로 << 를 이용하면 입력 여러개를 하나로 합치는 기능이다.

 

  • /dev/null

  어떤 프로그램의 출력값을 화면, 파일에 출력하지 않고 날려버리고 싶은 경우에 /dev/null을 이용하면 된다. 유닉스 계열에서 /dev/null은 쓰레기통같은 역할을 해서 Redirection을 /dev/null로 해주면 결과값이 사라지게된다. 예를들면 ls -al > /dev/null을 입력하면 ls -al의 결과값이 날라가므로 아무일도 일어나지 않는다.

 


reference. https://opentutorials.org/course/2598/14199

관련글 더보기