쉘기능을 자유자재로 다루기_08 리다이렉트가 번잡하지 않도록 그룹핑해서 보기 좋게 만들기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: echo
키워드: 리다이렉트, 그룹핑
사용처: 여러 명령어 결과를 같은 파일에 리다이렉트해서 출력하는 걸 한꺼번에 묶어서 작성하고 싶을 때


실행예제

$ ./echo-redirect.sh
$ cat output.log
[Script start]
Sat Jan 18 22:21:22 KST 2014
echo-redirect.sh
output.log
script.sh
[Script end]

스크립트

#!/bin/sh

# 중괄호를 그룹핑해서 리다이렉트를 하나로 합치기
{
  echo "[Script start]"
  date
  ls
  echo "[Script end]"
}>output.log

   

해설

이 스크립트는 여러 명령어 결과를 합쳐서 하나의 파일로 리다이렉트해서 출력합니다. { } (중괄호)로 그룹핑하는 것이 중요합니다. date 명령어로 날짜를 표시한 다음 ls 명령어를 실행합니다. 실제로는 여러분이 사용하고 싶은 명령어를 쓰면 됩니다.

셸 스크립트를 만들다 보면 명령어 결과를 같은 파일에 리다이렉트하는 처리를 몇 줄에 걸쳐 반복해서 작성해야 할 때가 있습니다. 이런 문법은 읽기도 힘들고 작성하기도 번거롭습니다.

echo "[Script start]" > output.log
date >> output.log
ls >> output.log
echo "[Script end]" >> output.log

이렇듯 리다이렉트가 이어질 때는 1처럼 중괄호를 써서 명령어 묶음을 그룹핑합니다. 그룹핑을 사용하면 2처럼 마지막에 한 번만 리다이렉트하면 되므로 스크립트가 깔끔해집니다. 보기도 좋고 리다이렉트하는 파일을 바꾸고 싶을 때도 한 곳만 수정하면 되므로 보수성도 좋아지고 코딩 스타일로도 좋습니다.

그런데 그룹핑을 중괄호가 아니라 ( ) 소괄호를 사용할 때도 있습니다. 소괄호로 그룹핑을하면 내부 명령어는 서브셸로 실행됩니다. 예제에서는 별 차이가 없지만 예들 들어 cd 명령어로 디렉터리를 이동하면 서브셸에서 빠져나갈 때 원래 디렉터리로 돌아가므로 중괄호의 그룹핑과 달라집니다.

   

주의사항

  • 다음처럼 중괄호 안에서 명령어를 한 줄로 작성할 수 없습니다. 짧은 명령어가 2~3개 정도라면 이쪽이 더 보기 좋을 수도 있습니다.

    { echo "[Script start]"; date; ls; echo "[Script end]"; } > output.log
    

    그런데 한 줄로 나열해서 작성할 때는 명령어마다 세미콜론이 필요합니다. 마지막 세미콜론을 잊는 경우가 많으므로 주의해야 합니다.