본문 바로가기
리눅스/프로그래밍

[리눅스] 심플하게 구현하는 echo 명령어(command)

by hseoy 2020. 11. 7.
반응형

이 글에서는 인자로 받은 값들을 그대로 출력하는 echo 명령의 아주 간단한 형태를 같이 구현해보려고 한다. 여기서 구현하려는 echo 명령이 가지는 단 한 가지 기능은 아래와 같다.

- 인자로 받은 모든 값들을 공백을 기준으로 출력한다.

그리고 이러한 기능을 구현하기 위해서 알아야 할 것은 main() 함수로 전해지는 매개변수이다. main()로 전해지는 매개변수에는 두 가지가 있는데 하나는 프로그램을 실행할 때 입력한 인수의 개수이고 또 다른 하나는 그 인수들의 값이다. 인수의 개수는 int형으로, 그리고 인수들의 값(문자열)은 2차원 포인터 혹은 포인터 배열로 전해진다. 즉 main() 함수는 우리가 일반적으로 사용하던 main(void) 말고도 다음과 같이 사용할 수 있다. 

int main(int argc, char *argv[])
{
    //
}

위와 같은 내용을 이해했다는 전제로 우리는 아래와 같은 테스트 프로그램을 작성할 수 있는 능력이 있다.

#include <stdio.h>

int main(int argc, char *argv[])
{
    int i = 0;
    for (i = 0; i < argc; i++) {
        printf("%s ", argv[i]);
    }
    return 0;
}

위 코드에 대해서는 모두가 이해했을 거라 보지만 다시 한번 설명해보자면 프로그램을 실행하며 입력한 인수들을 순서대로 공백을 기준으로 출력하는 것이다. 어라? 우리가 원래 만들려고 했던 가장 기본적인 echo 프로그램과 같지 않은가? 맞다. echo의 가장 기본적인 형태는 main() 함수에 전달되는 매개변수에 대한 것만 이해해도 작성할 수 있다. 그러므로 리눅스 명령에 대한 구현을 너무 무서워 할 필요는 없다. 알아야 하는 것을 알고 이해해야 하는 것을 이해했다고 할 때 모든 지 구현할 수 있다.

여기서 끝내기에는 너무 아쉬우므로 아주 작은 디테일 하나를 추가해보려고 한다. 마지막으로 출력되는 인수 뒤에는 공백을 출력하지 않고 싶다. 어떻게 해야 할까? 여기서는 삼항 연산자를 통해서 argc와 i의 값이 같으면 공백이 아닌 빈 문자열을 출력하도록 하였다. argc에서 i를 뺐을 때 0이 아니라면 같지 않은 것이므로 공백을 출력했다.

#include <stdio.h>

int main(int argc, char *argv[])
{
    int i = 0;
    for (i = 0; i < argc; i++) {
        printf("%s%s", argv[i], (argc-i) ? " " : "");
    }
    return 0;
}

그리고 이 시점에서 한번 gcc를 사용해서 컴파일을 하고 실행해보자.

$ gcc -o echo main.c
$ ./echo hello
hello$ ./echo
$

실행을 해보니 $가 출력된 값 바로 뒤에 붙는다. 이렇게 안 예쁘게 나오는 것을 방지하기 위해서 개행 문자 출력문 한 줄을 추가해주자. 이렇게 해서 완성된 가장 기본적인 형태의 echo 명령 구현 소스 코드는 아래와 같다.

#include <stdio.h>

int main(int argc, char *argv[])
{
    int i = 0;
    for (i = 0; i < argc; i++) {
        printf("%s%s", argv[i], (argc-i) ? " " : "");
    }
    printf("\n");
    return 0;
}

이렇게 아주 짧은 몇 줄의 코드로 리눅스에서 자주 사용하는 명령인 echo의 가장 기본적인 구현을 완료했다. ><

반응형

댓글