셸에 대해 본격적으로 공부하기에 앞서, 먼저 표준 입력과 표준 출력에 관해 알아보겠습니다. 우리는 보통, 어떤 명령을 사용할 때 파일 이름이라던가 아니면 필요한 다른 요소를 함께 적어주며, 이 명령의 결과는 화면에 뿌려집니다. 예를 들어 다음과 같은 경우를 살펴 보겠습니다.

[heyjin@heyjin Work]$ cat test.txt 이 파일은 표준 입력과 표준 출력을 설명하기 위한 것입니다. 언제나 즐리눅싱 되세요. ^_^ [heyjin@heyjin Work]$

여기에서, cat이라는 명령의 뒤에는 test.txt라는 파일 이름이 들어갔습니다. 이것은 test.txt의 내용을 받아 읽어 화면에 뿌리라는 명령입니다. 즉, test.txt는 원하는 작업을 하는 데 필요한 입력 요소입니다. 이 명령의 결과로는 text.txt의 내용인 두 줄의 문장이 화면에 출력됩니다.

여기에서 test.txt와 같이 명령을 실행하기 위해 필요한 입력을 표준 입력, 그리고 명령의 실행 결과를 표준 출력이라 합니다. 또한 표준 입력은 STDIN, 표준 출력은 STDOUT로 표시하기도 합니다. 이것은 표준 입력(Standard Input)과 표준 출력(Standard Output)의 약자로 미리 정의된 핸들러의 이름이기도 합니다. 어떤 프로그램을 실행하는 명령이 입력되어 이 프로그램이 메모리에 적재된 상태를 프로세스라고 부르는데, 이 두 개의 핸들은 각 프로세스가 열려 있는 상태에서 받습니다. 표준 입력을 받아 프로세스가 작업을 마치면, 화면에 출력하는 명령 행 프로그램이 이 내용을 표준 출력으로 내보냅니다.

표준 입력과 표준 출력의 방향은 기본적으로 정해져 있습니다. 대개의 경우 표준 입력은 키보드로 입력받은 내용이며 표준 출력은 화면에 출력됩니다. 그렇다면 표준 입력과 표준 출력의 방향을 바꿔 주면 어떨까요? 괄호 기호인 >와 <를 이용하면 이와 같은 입력과 출력의 방향을 바꿀 수 있습니다. 그러면 먼저 간단한 예를 들어 보겠습니다.

[heyjin@heyjin Work]$ cat test.txt 이 파일은 표준 입력과 표준 출력을 설명하기 위한 것입니다. 언제나 즐리눅싱 되세요. ^_^ [heyjin@heyjin Work]$ cat > test.txt 이것은 입력과 출력의 방향을 바꾸는 것입니다. 어디, 어떻게 변했을지 살펴볼까요? ^_^ Ctrl+d [heyjin@heyjin Work]$ cat test.txt 이것은 입력과 출력의 방향을 바꾸는 것입니다. 어디, 어떻게 변했을지 살펴볼까요? ^_^ [heyjin@heyjin Work]$

원래 내용이 있던 test.txt를 먼저 확인해 보고, cat > test.txt 명령을 이용하여 출력의 방향을 바꾸었습니다. cat > test.txt는 cat을 마치 DOS 시절의 copy con 명령과 같이 사용하는 방법입니다. DOS를 사용해 보신 분들은 기억하시리라 생각합니다. 이 명령은 파일을 읽는 명령인 동시에 라인 에디터의 역할을 할 수 있는 명령입니다. 입력을 마치실 때는 Ctrl+d 키를 눌러 주세요.

다시 읽어 본 test.txt 파일에는 원래의 파일 내용이 사라진 대신 새로이 입력한 내용이 저장되었습니다. 그렇다면 이렇게 해 보면 어떨까요?

[heyjin@heyjin Work]$ cat >> test.txt 이 내용은 어디에 들어갈까요? /)/) (-.-) (___)/ [heyjin@heyjin Work]$ cat test.txt 이것은 입력과 출력의 방향을 바꾸는 것입니다. 어디, 어떻게 변했을지 살펴볼까요? ^_^ 이 내용은 어디에 들어갈까요? /)/) (-.-) (___)/ [heyjin@heyjin Work]$

먼저 실행한 것과 무엇이 달라졌습니까? 그렇습니다. >> 와 같이 사용하면, 기존의 파일 내용을 보존한 채 기존 내용 뒷부분에 새로 입력하는 내용을 저장하겠다는 뜻입니다.

그러면 이번에는, 이런 식으로 실행해 보겠습니다. grep이라는 명령에 대해 먼저 간단히 설명하겠습니다. grep은 어떤 문자열과 일치하는 문자열이 들어 있는 줄을 찾아내는 명령입니다. 여기에서는 아까 만들어 보았던 text.txt에서 ‘은’이라는 글자가 들어 있는 줄만 뽑아서 보도록 하겠습니다.

[heyjin@heyjin Work]$ grep 은 test.txt 이것은 입력과 출력의 방향을 바꾸는 것입니다. 이 내용은 어디에 들어갈까요?

잘 출력되지요? 그렇다면, 이렇게 해 보면 어떨까요?

[heyjin@heyjin Work]$ grep test.txt 은 grep: 은: 그런 파일이나 디렉토리가 없음

역시 에러가 날 것입니다. 그렇다면 다음과 같은 방법은 어떨까요?

[heyjin@heyjin Work]$ grep <test.txt 은 이것은 입력과 출력의 방향을 바꾸는 것입니다. 이 내용은 어디에 들어갈까요?

예, ‘grep 은 test.txt’와 ‘grep <test.txt 은’은 같은 결과를 내고 있습니다. 앞서 설명한 > 이 출력의 방향을 화면이 아닌 다른 파일로 바꾸었듯이, < 는 입력의 방향을 바꾸는 데 사용됩니다. 물론 리눅스에서는 모든 주변 장치(디바이스)를 파일로 인식하고 있으므로, 지금 보고 있는 화면 외의 다른 화면으로 출력하는 등, 여러 가지로 응용할 수 있습니다. 혹은 장문의 편지 내용이 들어 있는 파일을 미리 작성해 maildata라는 이름의 텍스트 파일로 저장한 후 다음과 같은 방법으로 간단하게 메일을 날릴 수도 있고요.

[heyjin@heyjin Work]$ mail heyjin@hanbitbook.co.kr < maildata

이 외에도, 표준 입출력의 방향을 바꿔 편리하게 사용할 수 있는 일은 많을 것입니다.