ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • She # bang !
    CS/시스템 프로그래밍 2023. 12. 17. 00:10

     

     

    자주 눈에 보이지만 그냥 써야되나보다 하고 지나갔던 것을 짚어봅니다.

    스프링 프로젝트를 설치하는 스크립트를 작성하다가 의문이 들어서 찾아보게 되었습니다.

     

     

     


     

     

    1. Shebang이란?

     

    스크립트 파일 맨 첫줄에 적는 이건 뭐지? 주석인가?

     

    #!/usr/bin/env bash

     

     

     

    우선 이 줄의 명칭은 shebang입니다. 왜냐하면 #! 으로 시작하기 때문입니다~

    커뮤니티에서 #을 she 혹은 hash 라고 부르고 !을 bang이라고 부르는 것에서 유래한다고 하네요.

     

     

     

     

    2. 역할

    해당 파일이 어떤 실행기를 통해서 실행되어야하는지를 명시하는 역할입니다.

    한번 자세하게 살펴볼까요?

     

    /usr/bin/env bash

     

     

     

    잘은 모르겠지만 env 하면 환경변수 관련 내용일 것 같은 느낌입니다.

    위 경로에 가보면 실제로 env라는 실행 파일이 존재합니다.

     

     

    /usr/bin 경로에 있는 env

     

     

     

    이 실행 파일을 통해서 현재 시스템의 PATH 환경변수에 등록되어 있는 bash를 사용하게 됩니다.

     

    $ which bash   "/bin/bash"

     

    which를 사용해서 제 컴퓨터의 bash의 위치를 찾아보니 /bin/bash에 들어있습니다.

    그렇다면 해당 shebang이 적힌 스크립트를 실행시킨다면, 제 경우에는 /bin/bash를 사용해서 스크립트를 실행하게 되는 것 입니다!

     

     

     

     

    3. 이식성

    그냥 처음부터 /bin/bash 라고 적으면 되지 왜 굳이 /usr/bin/env 라고 적는지 의문이 생기신다면 감이 좋으신 분이라고 생각이 됩니다.

     

    #!/bin/bash

     

    이번 경우에는 내 컴퓨터에서 작성한 스크립트를 내 컴퓨터에서 실행하는 경우이기 때문에 /bin/bash 를 적어도 문제가 없겠지요.

    하지만 해당 파일을 다른 컴퓨터에서도 실행시킬 수 있다고 생각해볼까요? 어떤 시스템에서는 bash가 존재하는 경로가 /bin/bash가 아니라면 파일은 실행되지 못할 것 입니다.

     

     

    이것은 /usr/bin/env에 대해서도 마찬가지입니다. 만약 env의 위치가 다른 곳에 있다면 지금의 shebang 역시 작동하지 않겟지요?

    하지만 다행히도 많은  시스템들은 'env'가 표준적으로 '/usr/bin/env'에 위치하고 있다고 합니다. 이식성 향상을 위함이겠네요.

     

     

     

     

    4. 그저 운이 좋았을 뿐

    저는 보통 스크립트를 실행시킬 때, shebang과 관계없이 아래의 명령어로 스크립트를 실행시켰습니다.

     

    sh xxx.sh

     

    항상 잘 실행되었고, shebang과 관계없이 원하던 작업이 잘 진행되어서 신경을 쓰지 않고 지냈던 것 같습니다.

    하지만 이번에 알게 된 사실인데, sh xxx.sh 혹은 bash xxx.sh 로 스크립트를 실행시킨다면 shebang을 무시하고 실행이 된다고 합니다.

     

     

    지금까지는 운좋게 문제가 없었으나, 문제가 발생할 소지가 있어보입니다.

    sh 와 bash 의 차이
    
    sh: sh는 유닉스 시스템에서 개발된 Bourne Shell의 약자
    bash: bash는 sh의 확장판

     

    만약 해당 스크립트가 bash 만의 기능을 사용하는데, sh로 실행된다면 문제가 발생할 것 입니다.

    그러면 어떻게 실행해야 shebang을 사용할 수 있을까요?

     

     

     

     

    5. 실행파일로 만들기

     

    init-product-service.sh 라는 스크립트를 작성하고 ./init-product-service.sh 로 실행시켜보았습니다.

    권한을 묻길래 sudo로 다시 실행시켰더니 아래와 같은 답을 주었습니다. 

     

     

     

    이번에는 동일한 스크립트 파일에 실행 권한을 주고 다시 실행시켜보겠습니다.

     

    $ chmod +x init-product-service.sh
    $ ./init-product-service.sh

     

     

    이번에는 sh ./init-product-service.sh 로 실행시키는 것과 동일하게 스크립트가 실행되었습니다.

    이렇게 실행 권한을 부여하고 실행한다면 shebang에 적힌대로 동작하게 됩니다.

     

     

     

     

     


     

     

Designed by Tistory.