Ubuntu에서 bash script를 만들 때 아무 생각 없이 작성하던 #!/bin/bash. 무슨 의미인지 급 궁금해져서 자료 조사해봤다.
스크립트의 맨 윗줄에 위치한 #!~ shebang이라는 것으로, 스크립트를 실행할 때 사용할 인터프리터를 지정하는 역할을 수행한다. 즉, #!/bin/bash는 본 스크립트를 bash shell로 실행하라는 의미이며, bash의 주소는 /bin/bash임을 나타낸다.
chmod +x script_file로 스크립트를 executable로 만들 수 있다. executable로 실행시킬 때는 shebang이 없으면 본 스크립트를 어떻게 실행시켜야 하는지 모르기 때문에 shebang이 필요하다. 스크립트를 실행파일로 실행시키지 않는다면 꼭 넣어주지 않아도 된다. 예를 들어, bash script_file 명령어로 스크립트를 실행시키는 경우, script_file을 bash로 실행시킨다는 의미이므로 shebang이 필요하지 않다.
#!/usr/bin/env node의 의미간혹 #!/usr/bin/env node와 같은 shebang이 붙는 경우가 있다. express-generator를 사용하여 express.js skeleton app을 생성시킬 때 만들어지는 ./bin/www에도 위와 같은 shebang이 붙는다.
env는 현재 시스템의 환경 변수를 확인하거나 설정할 수 있는 유닉스 계열의 명령어다. 예를 들어, /usr/bin/env node를 입력하면 현재 시스템의 환경변수에서 node 위치를 찾아서 실행시킨다.
즉, shebang으로 #!/usr/bin/env node를 사용하면 현재 스크립트를 환경변수에 저장된 위치의 node로 실행시킬 수 있게 되는 것이다.
이는 스크립트를 실행시킬 환경을 모를 때 유용하다. bash가 /bin/bash에 저장되어있는 것을 안다면 #!/bin/bash를 사용해도 된다. 그러나 bash가 /somewhere/over/the/rainbow/bash에 위치해있다면? 스크립트를 만든 사람에게 미리 알려주지 않는 이상, 알아낼 방법이 없다. 이때 #!/usr/bin/env bash를 사용해주면 스크립트를 실행시키는 내 운영체제는 /somewhere/over/the/rainbow/bash를 찾아서 실행시켜줄 것이다.
정리하자면, #!/usr/bin/env node는 스크립트 파일의 이식성을 높여주는 shebang 사용 방법이라고 할 수 있다.