예를 들어# cat ./*.txt 라고 하면 디렉토리내의 모든 txt파일에 대해 cat이 됩니다.
# cat ./*.txt
하지만 제가 cat과 비슷하게 동작하는 my_cat이란 쉘스크립트를 만들었을때는# my_cat ./*.txt 이라고 하면 제대로 동작이 안됩니다. a.txt b.txt c.txt 처럼 하나하나 실행해야만 동작이 됩니다. 이때 디렉토리의 모든 txt파일에 대해 동작하게 하려면 어떻게 구현해야 할까요?
# my_cat ./*.txt
굳이 " " 등으로 둘러싸서 와일드카드를 사용한 경우만 아니라면 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, ....); ... }
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
굳이 " " 등으로 둘러싸서 와일드카드를 사용한
굳이 " " 등으로 둘러싸서 와일드카드를 사용한 경우만 아니라면
shell이 와일드카드를 해당 파일명들로 미리 확장해서 넘겨줍니다.
위의 두 번째 예에서 보이듯,
사용자 프로그램은 /usr/include/std*.h 를 넘겨받는 것이 아니고 확장된 목록을 받게 되므로
대략 아래와 같은 식으로 루프돌면서 파일 하나씩 처리해주시면 됩니다.
댓글 달기