-
shebang 작성하기개발/환경 2022. 6. 17. 16:44
스크립트를 작성할 때 버릇처럼 적는 한줄이 있다.
#!/bin/bash
#!/bin/expect
#!/bin/python3
이 구문은 shebang 이라는 구문인데, 간단하게는 실행할 때 어떤 스크립트인지 명시하는 부분이라고 생각해도 된다. (영문, 국문 위키백과)
이 글에서는 shebang 을 작성할 때 고려할만한 내용을 작성한다.
대부분의 경우 bash script나 expect script를 작성할땐 이 shebang을 어떻게 표기할지 고려할 필요가 없다. bash는 대부분의 환경이 /bin/bash에 있을것이며 expect는 설치가 보장되어있지 않다면 패키지를 같이 보내서 설치하라고 하면 그만이니
이 문제를 고민하게 된 원인은 python 덕분이었다.
python3.7버전의 소스를 내려받아 특정 위치에 설치하도록 configure 하고, 빌드를 했더니만 bin 디렉토리에 있는 스크립트들. 예를들면 pip, pip3 등의 shebang이 빌드를 했던 위치로 표시되어 버리는것이 아닌가.
#!/home/mypc/work/pkg/bin/python3.7 # -*- coding: utf-8 -*- import re import sys from pip._internal.cli.main import main if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) sys.exit(main())
이걸 그대로 배포할순 없다. python binary를 절대경로로 직접 호출해서 모듈 호출 명령(-m) 으로 pip를 호출할때야 문제 없지만, 모든 호출이 그런식으로 이루어진다는 보장도 없잖은가. 최소한 PATH와 같은 내가 설정 가능한 영역으로 있어야 하는데 shebang에 직접적으로 환경 변수를 명시할 수도 없다.
그래서 등장한
#!/usr/bin/env
리눅스 명령 중 env를 입력하면 현재 터미널에서 설정된 환경변수를 모두 볼수 있다. 사실 이 친구는 바이너리인데 인자로 바이너리 이름을 주면 실제로 PATH에 설정된 바이너리를 찾아 실행할 수 있다.
정상적으로 PATH에 bin 디렉토리가 포함되어있다면 아래의 명령은 환경변수 PATH에서 찾을 수 있는 python3 을 실행한다. PATH가 설정된 상태에서 python3을 실행한 것 과 다른점이 없다는 뜻이다
env python3
이는 shebang에서도 사용할 수 있다.
#!/usr/bin/env python3
위와 같이 작성함으로써 python3을 실행하는 쉘 스크립트에서 Python의 PATH만 우선 적용되도록 작성한다면, 빌드 위치와 상관 없이 동일한 shebang만 입력해두면 된다.
굳이 설치 스크립트에서 문자열을 손대지 않아도 되는 나름의 우아한? 방법이다.
'개발 > 환경' 카테고리의 다른 글
svn에서 __pycache__ 와 .pyc ignore하기 (0) 2022.06.17 C환경을 위한 Jenkins 구축하기(Tomcat, MSBuild, Visual SVN) (0) 2020.02.05