15. 입출력 리다이렉션과 파이프를 알아보아요.

안녕하세요. 언제나 휴일, 언휴예요.

쉘에서 표준 출력으로 출력하면 일반적으로 모니터에 출력하며 표준 입력으로 입력 받으면 키보드로 입력받습니다. 그런데 표준 출력으로 출력하는 것을 모니터가 아닌 다른 파일로 출력을 하거나 표준 입력으로 입력 받는 것을 키보드가 아닌 다른 파일로부터 입력받게 할 수 있어요. 이를 입출력 리다이렉션이라고 말합니다.

출력 리다이렉션에는 > 혹은 >> 를 사용하며 입력 리다이렉션에는 < 를 사용합니다.

  • 명령 > 파일명

>를 사용할 때는 우측의 명령에 의한 표준 출력을 좌측 파일로 출력합니다. 만약 파일이 존재하지 않으면 새로운 파일을 만들어 출력하며 파일이 존재할 때에는 기존 파일의 내용을 지우고 덮어 씌웁니다.

테스트를 위해 표준 출력을 통해 “Hello\n”를 출력하고 표준 에러를 통해 “Yahoo\n”를 출력하는 C언어 소스 파일을 작성하고 컴파일 하세요. 다음은 demo.c 파일의 내용입니다.

#include <stdio.h>
int main()
{
    printf(“Hello\n”);
    printf(“Yahoo\n”);
    return 0;
}

gcc 명령을 통해 실행 파일을 만드세요.

$ gcc -o demo demo.c
[그림 1] demo.c 소스 파일 내용 및 컴파일
[그림 1] demo.c 소스 파일 내용 및 컴파일

demo 파일을 실행하면 “Hello\n”와 “Yahoo\n”를 출력합니다. (“\n는 개행임) 그런데 “Helo\n”는 표준 출력으로 출력을 요청하였고 “Yahoo\n”는 표준 에러로 출력을 요청하였죠. 디폴트 표준 출력과 표준 에러는 모두 콘솔 화면이므로 둘 다 콘솔 화면에 출력합니다.

[그림 2] demo 실행
[그림 2] demo 실행

만약 리다이렉션을 통해 표준 출력을 output 파일로 변경하면 표준 출력에 요청한 “Hello\n”는 output 파일의 내용으로 출력하고 콘솔 화면에는 “Yahoo\n” 내용만 보입니다.

[그림 3] output 파일로 표준 출력 리다이렉션
[그림 3] output 파일로 표준 출력 리다이렉션
  • 명령 > & 파일명

만약 표준 출력과 표준 에러 모두 리다이렉션을 원한다면 파일명 앞에 &를 붙이세요.

[그림 4] output 파일로 표준 출력, 표준 에러 리다이렉션
[그림 4] output 파일로 표준 출력, 표준 에러 리다이렉션
  • 실행 파일디스크립터번호> 파일명

출력 리다이렉션은 > 기호 앞에 리다이렉션할 파일 디스크립터 번호를 지정할 수 있어요. 만약 아무 것도 지정하지 않으면 디폴트는 1(기본 출력)입니다. 이는 앞의 실험을 통해 확인을 했어요. 다음은 표준 에러를 output으로 출력 리다이렉션한 예입니다.

[그림 5] output 파일로 표준 에러 리다이렉션
[그림 5] output 파일로 표준 에러 리다이렉션
  • 실행 >> 파일명

출력 리다이렉션에서 > 기호를 사용하면 기존의 파일 내용을 지우고 덮어 씌웁니다. 만약 기존 파일 끝에 추가를 원한다면 >> 기호를 사용하세요. 다음의 예를 보면 > 기호를 이용하여 출력 리다이렉션을 하면 기존 내용은 사라지고 새롭게 쓰여진 것을 알 수 있어요. 반면 >> 기호를 이용하면 기존 내용 끝에 추가로 쓰여진 것을 확인할 수 있습니다.

[그림 6] 추가 모드로 출력 리다이렉션
[그림 6] 추가 모드로 출력 리다이렉션
  • 실행 < 파일명

입력 리다이렉션을 할 때는 < 기호를 사용합니다. 테스트를 위해 간단한 소스를 편집하기로 합시다. 다음은 demo2.c 소스 파일 내용으로 번호와 이름을 입력 받아 출력하는 간단한 프로그램 소스 코드입니다.

#include <stdio.h>
int main()
{
    int num;
    char name[20]=””;

    printf(“번호를 입력하세요.\n”);
    scanf(“%d”,&num);
    printf(“이름을 입력하세요.\n”);
    scanf(“%s”,name);

    printf(“번호:%d 이름:%s\n”);
    return 0;
}

다음은 demo2.c 파일을 컴파일 한 후에 실행한 화면입니다.

[그림 7] demo2.c 소스 파일 내용 및 컴파일과 실행
[그림 7] demo2.c 소스 파일 내용 및 컴파일과 실행

입력 리다이렉션을 테스트하기 위해 input 파일을 편집하세요. 다음은 input 파일의 내용입니다.

3
홍길동

이제 입력 리다이렉션을 통해 input 파일의 내용을 입력 받아 demo2 프로그램을 동작해 봅시다.

[그림 8] 입력 리다이렉션
[그림 8] 입력 리다이렉션

실행 | 실행

파이프는 | 기호를 사용하며 좌측의 실행의 표준 출력을 우측 실행의 표준 입력으로 사용하는 것입니다. 다음은 ls -al 명령의 출력 결과를 grep의 입력으로 사용하기 위해 파이프를 사용한 예입니다.

[그림 9] 파이프 사용 예
[그림 9] 파이프 사용 예

다음은 ls 명령과 파이프 grep을 이용하여 질의를 인자로 전달하면 내부에서 “ls -al|grep 질의”를 수행하는 스크립트입니다.

#lsgrep
#쉘 프로그래밍 실습
#파이프 사용
#작성자 : eh. jang
if [ $# -eq 1 ]
then
    ls -al | grep $1
else
    echo Usage:$0 query
fi
[그림 10] 파이프 사용 예2
[그림 10] 파이프 사용 예2