ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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만 입력해두면 된다.

     

    굳이 설치 스크립트에서 문자열을 손대지 않아도 되는 나름의 우아한? 방법이다.

Designed by Tistory.