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에는 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에 저장하라는 명령어이다.
위의 > 를 이용한 파일 내용 저장방법은 덮어쓰기 방법이다. 만약 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은 쓰레기통같은 역할을 해서 Redirection을 /dev/null로 해주면 결과값이 사라지게된다. 예를들면 ls -al > /dev/null을 입력하면 ls -al의 결과값이 날라가므로 아무일도 일어나지 않는다.
reference. https://opentutorials.org/course/2598/14199
42 Seoul 대비 리눅스 공부 (생활코딩 - 파이프 라인과 grep) (0) | 2023.01.26 |
---|---|
42 Seoul 대비 리눅스 공부 (생활코딩 - 파일 다운로드 방법) (0) | 2023.01.25 |
42 Seoul 대비 리눅스 공부 (생활코딩 - 패키지 매니저) (0) | 2023.01.25 |
42 Seoul 대비 리눅스 공부 (생활코딩 - sudo, nano 에디터로 파일 편집하기) (0) | 2023.01.25 |
42 Seoul 대비 리눅스 공부 (생활코딩 - 필요한 명령 검색하기, cp, mv) (0) | 2023.01.25 |