셸의 힘은 프로그래밍과 사용 사이의 경계를 허문다는 점에서 나옵니다. 즉, 셸을 통해 기계를 사용하는 행위 자체가 프로그래밍이며, 셸 프로그래밍이 곧 기계를 다루는 방법이란 점에서 매우 매력적입니다.

C나 Java, ML과 같은 본격적인 프로그래밍 언어는 물론이고 Perl이나 Tcl과 같은 스크립트 언어들로 프로그래밍을 하는 경우에도, 결국 짠 프로그램은 다른 언어나 환경(셸이나 IDE 등)를 통해서 사용해야 합니다. 프로그래밍과 사용의 경계가 분명하게 그어져있기 때문에 자기가 좋아하는 언어로 간단히 한 줄에 처리할 수 있는 작업도 바깥 세계에서 쓸 수 있게 연결하는 과정에서 징그럽게 변하고 맙니다.

반면, 셸은 그 자신이 사용을 위한 언어이자 프로그래밍을 하는 환경입니다. 셸에서 일련의 명령을 입력하며 일상적인 작업을 하다가도 언제든지 부담 없이 손쉽게 프로그래밍으로 전환할 수가 있습니다. 다른 문법으로 생각을 해야한다거나, 별도의 환경을 준비할 필요가 없습니다. 명령들의 반복적인 쓰임새를 발견하고 이들을 일반화할 아이디어만 떠올린다면 그들을 별도의 파일이나 함수로 묶어두면 그만이기 때문이죠.

이렇게 셸 프로그래밍은 손쉽기 때문에 확장 용이, 재사용 기회 높음...

셸 프로그래밍이 가능하면 어떤 도구라도 쉽게 확장하여 쓸 수 있습니다. 모든 프로그램을 사용하는 가장 기본적인 방법은 셸을 통해서 실행하는 것입니다. 사용하는 도구가 아주 단순한 기능만 제공하더라도 셸을 잘 다룰 수만 있으면 얼마든지 여러분들이 원하는 복합적인 기능을 하는 도구로 확장할 수 있습니다. 가령, 한 파일만 처리할 수 있는 basictool이란 프로그램을 갖고 있다고 가정해봅시다. 그런데 지정한 디렉토리에 대해서 그 속의 모든 파일을 처리하는 기능이 필요하다고 합시다. basictool의 소스코드를 뜯어고쳐 디렉토리를 입력받는 경우에 파일들을 찾고 그들을 처리하게 고치면 되겠지만, 만약 여러분이 소스코드를 가지고 있지 않거나 가지고 있더라도 고치고 컴파일할 수 없는 상황이라면 매우 곤란할 겁니다. 아래와 같이 셸을 이용하여 mytool 명령을 정의해 쓰면 간단히 해결할 수 있습니다.

mytool() {
  if [$1 ]( -d); then
    for f in $1/*; do
      basictool $f
    done
  else
    basictool $1
  fi
}

셸을 적극 활용하면 기계 다루는 능력을 ... 셸을 사용하는 것 자체가 프로그래밍 능력 연마로 이어지고, 프로그래밍 능력이 향상되면서 기계를 다루는 종합적인 능력도 올라갑니다.


sh pgmg