소개

shebang에 대하여 개념 및 실제 사용법에 대해서 간략하게 알아봅니다.

참고: https://en.wikipedia.org/wiki/Shebang_(Unix)

개념설명

unix 계열의 명령어나 스크립트 파일을 실제 코드로 살펴보면 ’#!’ 로 시작되는 코드를 볼 수 있습니다.

이를 영어로 shebang이라 표현하고 쉬뱅 정도로 발음하면 됩니다. sharp(#) + bang(!) 에서 유래되었다고 합니다.

’#!‘은 2Byte의 매직넘버(magic number)로 이 스크립트를 실행시켜줄 프로그램의 경로를 지정하는 역활을 합니다.

#!/bin/bash
#!/bin/node
...

보통 unix시스템에서 /bin 하위에 해당 명령어들이 존재하지만, 정확하게 해당 path에 존재하지 않는 경우도 많습니다. 따라서 이러한 경우, env를 지정하여, 각 환경에 env에 정의된 path을 참조하게 할 수 있습니다.

#!/usr/bin/env bash
#!/usr/bin/env node
...

대체로 다양한 환경을 지원하는게 좋기 때문에 ‘env’형태로 shebang을 구성하는게 추천됩니다.

실제 사용법

실제로는 생성하려는 script나 command 파일의 최상단에 shebang을 기입하고, 그외 부분에 해당 shebang환경에서 구동되는 코드를 작성하면 됩니다. 아래 예제는 node shebang을 사용하여 unix의 ls -al 을 대체하는 lsall 예제입니다.

lsall

#!/usr/bin/env node

const { spawn } = require('child_process')

const runCommand = async (command, options) => {
  return new Promise((resolve, reject) => {
    const prc = spawn(command, [...options], {
      cwd: process.cwd(),
    });

    let result = '';
    prc.stdout.on('data', (data) => {
      result += data.toString();
    });
    prc.stderr.on('data', reject);
    prc.on('close', (code) => {
      resolve(result);
    });
  });
};

runCommand('ls', ['-al'])
  .then((result) => console.log(result))
  .catch(() => console.error('ls -al Failed...'));

lsall파일에 excution설정(chmod +x lsall)이 되어 있다면, 실행시 node 명령어를 앞에 붙일 필요 없이 ./lsall 형태로 바로 수행 가능합니다.