자작 명령어의 인자값으로 *.txt를 받게 하려면 어떻게 해야 할까요?

k1d0bus3의 이미지

예를 들어
# cat ./*.txt
라고 하면 디렉토리내의 모든 txt파일에 대해 cat이 됩니다.

하지만 제가 cat과 비슷하게 동작하는 my_cat이란 쉘스크립트를 만들었을때는
# my_cat ./*.txt
이라고 하면 제대로 동작이 안됩니다. a.txt b.txt c.txt 처럼 하나하나 실행해야만 동작이 됩니다.
이때 디렉토리의 모든 txt파일에 대해 동작하게 하려면 어떻게 구현해야 할까요?

chanik의 이미지

굳이 " " 등으로 둘러싸서 와일드카드를 사용한 경우만 아니라면
shell이 와일드카드를 해당 파일명들로 미리 확장해서 넘겨줍니다.

$ echo "/usr/include/std*.h"
/usr/include/std*.h
$ echo /usr/include/std*.h
/usr/include/stdint.h /usr/include/stdio.h /usr/include/stdio_ext.h /usr/include/stdlib.h

위의 두 번째 예에서 보이듯,
사용자 프로그램은 /usr/include/std*.h 를 넘겨받는 것이 아니고 확장된 목록을 받게 되므로
대략 아래와 같은 식으로 루프돌면서 파일 하나씩 처리해주시면 됩니다.

for(int i=1; i<argc; i++) {
  char fname = argv[i];
  FILE *f = fopen(fname, ....);
  ...
}