IO의 I는 Input, O는 Output 약자로 입력과 출력을 의미하며
Redirection은 방향을 바꾼다는 의미를 가진다. 보통은 화면으로 output, 출력되는 것이 기본이지만 그 출력되는 방향을 우리가 다른 곳으로 돌려, Redirection하여 파일에 저장시킬 수 있다는 뜻을 가진다.
-첫 번째는 Standard Output으로 표준 출력이다.
-두 번째는 그 프로그램이 내부적으로 어떤 오류가 있을 때 그 오류는 중요한 정보이기 때문에standard error 출력으로 처리를 한다.
- ls 라고 하는 프로그램, 명령어를 실행을 시킨 건 위 사진의 동그라미 안에 있는 unix process에 해당된다.
- 그리고 프로세스는 크게 입력과 출력을 가지고 있는데 가장 기본적인 입력은 command line arguments라고 한다.
-예를 들어 ls 뒤에 -l 이라 붙이면 여기에 있는 -l이 ls라는 프로그램에 입력으로 들어오는 입력 값 중의 하나이다.
-바로 이런 형태로 실행될 때에 파라미터 다음으로 전달되는 입력 값을 commandline arguments라고 부른다. 이 역시 입력에 해당된다.
- ls -l process가 실행되면 결과를 화면에 출력해주는 것에 해당되는 것이 standard out이다. standard output은 기본적으로 프로그램을 실행한 결과가 모니터에 출력된다.
- 이렇게 모니터의 출력되는 그 방향을 Redirection 시켜서 다른 곳으로 출력되게 할 수가 있는데 대표적으로 파일에 출력할 수 있으며 Redirection 하기 위해서는 '>' 기호를 쓰고
뒤에다가 파일의 이름을 적는다.- 따라서 'ls -l > result txt'라는 코드는 ls -l 명령어를 실행한 결과가 화면에 출력되는 대신 바로 result.txt라는 텍스트 파일로 출력되어 파일 안에 저장되게된다.
x- '>' 꺽쇠 기호를 쓰는 것은 그림 상에서 standard output을 redirection 한 것으로
즉, standard error를 redirection 한 것은 아니다.
- 사실은 '>' 꺽쇠 기호 앞에 숫자 1이 생략되어 있는데 이는 standard output 표준출력이라고 하는 것을 의미한다.
- 만약 오류가 난 결과를 error.log라는 파일에 저장하고 싶다면 redirection 꺽쇠 기호 앞에 숫자 2를 붙여야한다. 이는 standard output이 아닌 standard error 정보의 출력에 대한 redirection 이라는 의미를 갖기 때문에 에러메세지가 출력되지 않고 error.log 라는 파일로 redirection이 된다.
한 번에 1>과 2> 리다이렉션 기호를 쓰면 앞에다가 1을 붙여서 standard output으로 redirection 시키면 만약에 출력하는 결과가 있다면 '1>' 앞에 있는 파일안에 저장이 된다. 혹은 프로그램을 실행한 결과에 에러가 포함되어 있다면 '2>'기호 앞에 있는 파일이 실행하는 과정에서 발생한 에러를 저장할 수 있다.
- 프로그램은 컴퓨터의 하드디스크나 또는 ssd에 저장되어 있는 그 코드를 프로그램이라하며
그 프로그램이 실행되면, 실행되고 있는 상태를 프로세스라고 부른다. 따라서 하나의 프로그램은 여러 개의 프로세스를 가질 수도 있다.- 프로세스는 stand output과 standard error라고 하는 두 가지의 출력의 형식을 가진다.
그리고 한 가지의 입력, standard input이 들어가 있다. 즉, 하나의 input과 2개의 output이 존재한다.- cat 이라고 하는 프로그램은 이 두 번째 인자로 파일 명이 들어오면 그 파일 명을 화면에 출력해 준다. 원래 cat의 목적은 여러 개의 정보를 결합해 주는 것이다.
- cat 명령을 그냥 실행시키면 프로그램이 끝나지 않고 대기 상태에 있게 되고
사용자가 입력한 정보를 standard input으로 받아 standard output으로 출력해준다.- cat은 기본적으로 키보드의 입력을 받지만 다음과 같이 'cat < 파일명' redirection을 시켜주고 파일 명을 적어주면 파일에 저장되어있는 내용을 입력으로 받아 화면에 결과가 출력된다.
정리하면 'cat 파일명'과 'cat < 파일명'은 같은 결과이지만 다른 과정을 거친다.
- 'cat 파일명'은 cat 프로그램에 인자로 전달한 것이다. 즉 그림상에 나오는 command line argument 를 통해서 전달한 입력 값(파일 내용)이 되는 것이고
-'cat < 파일명' cat 이라는 프로그램은 standard input 방식으로 입력을 받은 것으로 이렇게 (< 모양, parameter) 기호를 넣게 되면 인자가 아닌 표준 입력 standard input으로 cat에게 input을 시킨다.- 앞쪽에 있는 일부의 텍스트만을 화면에 출력하는 기능이 있는데 헤드(head)라는 명령어이다. 헤드(head)는 기본 열줄만 출력을 하는데 옵션으로 마이너스 (-n1) 하면 한 줄만 출력을 해준다
-'head -n1 one.txt'에서 헤드(head) 명령어는 command line argument 커멘드라인 인자를 준 것이다.
-'head -n1 < one.txt' '-n1'은 command line argument이고 '<' 기호로 파일명을 넣어주면 꺽쇠는 standard input을 준 것이다. 그러나 두개의 결과는 같다.
-만약 출력된 결과를 다시 텍스트에 저장하고 싶다면 'head -n1 < one.txt' 사용하여 출력된standard input을 다시 다른 파일에 저장하라고 명령하는 'head -n1 < one.txt > 저장할 다른 파일명'라고 치면된다.
-'head -n1 < one.txt > two.txt'이 코드에는 표준 입력에 대한 리다이렉션과 표준 입력에 대한 리다이렉션이 모두 포함되어 있다. 먼저 'one.txt'에 있는 내용이 리다이렉션 돼서
헤드(head) 프로세스에 입력되고 그 처리 결과를 'two.txt'에다가 출력을 한다.
<정리>
유닉스 계열의 시스템에서 실행되는 프로그램은 standard input, 키보드에 입력하는 값이있고 standard output, 화면에 출력되는 것, standard error 화면에 에러가 출력되는 것이라는 흐름을 가지고 있다.
그래서 이렇게 인풋과 아웃풋이 흘러나가는 이런 모양을 (IO stream)이라고도 한다.
- '>>' 꺽쇠가 이렇게 2개면 redirection을 하는데 그 redirection한 결과를 추가, 뒤에다가 덧대는 뜻을 가진다.
- 반대로 '<<' 여기에 방향이 바뀌면 입력이란 뜻인데 여러 개의 입력을 하나로 합친다.
즉, 이 꺽쇠 2개 뒤에 나오는 이 문자는 다음에 이 문자가 등장하면 거기서 입력이 끝나는 것이다- 그럼 우리가 경우에 따라서는 실행한 결과를 화면에도 출력하지 않고 파일에도 저장하지 않고 날려버리고 싶을 땐 'ls -al > /dev/null' '/dev/null', 유닉스계열에서 휴지통을 이곳으로 꺽새를 가리켜 redirection하면 그냥 사라져버린다.