etc./StackOverFlow

선호하는 Bash shebang은 무엇입니까?

청렴결백한 만능 재주꾼 2023. 4. 23. 02:47
반응형

질문자 :Kurtosis


대부분의 용도에서 다른 것보다 객관적으로 더 나은 Bash

  • #!/usr/bin/env bash
  • #!/bin/bash
  • #!/bin/sh
  • #!/bin/sh -

오래전에 끝에 대시를 추가하면 누군가가 스크립트에 명령을 전달하는 것을 방지할 수 있다고 들었지만 이에 대한 자세한 내용은 찾을 수 없다는 것을 어렴풋이 기억합니다.



이식성을 위해 #!/usr/bin/env bash 를 사용해야 합니다. 다른 *nixes는 bash 를 다른 위치에 배치하고 /usr/bin/env PATH 에서 찾은 bash 를 실행하는 해결 방법입니다. 그리고 sh bash 가 아닙니다 .


l0b0

다음을 사용하는 것이 좋습니다.

 #!/bin/bash

100% 이식 가능한 것은 아니지만(일부 시스템은 bash /bin 아닌 다른 위치에 둡니다), 기존 스크립트가 #!/bin/bash 사용한다는 사실은 다양한 운영 체제에서 /bin/bash 를 최소한 심볼릭 링크로 만들도록 압력을 가합니다. 주요 위치.

대안:

 #!/usr/bin/env bash

env 명령이 /usr/bin 에 있다는 보장은 없습니다(그리고 저는 그렇지 않은 시스템을 사용했습니다). 또한 이 양식은 현재 사용자 $PATH bash 의 첫 번째 인스턴스를 사용합니다. 이는 bash 셸의 적절한 버전이 아닐 수 있습니다.

(그러나 /usr/bin/env env/usr/bin 있거나 시스템이 작동하게 하기 위해 무언가를 하기 때문에 합리적으로 현대적인 시스템에서 작동해야 합니다. 위에서 언급한 시스템은 SunOS 4였습니다. 약 25년 동안 사용되지 않았습니다.)

/bin/bash 가 없는 시스템에서 스크립트를 실행해야 하는 경우 올바른 위치를 가리키도록 스크립트를 수정할 수 있습니다(이는 확실히 불편함).

나는 이 질문 에 대한 나의 대답 에서 더 깊은 상충 관계 에 대해 논의 했습니다 .

다소 모호한 업데이트: 내가 사용하는 시스템 중 하나인 Android에서 실행되는 데스크톱 Linux와 유사한 계층 인 Termux /bin/bash 가 없습니다( bash/data/data/com.termux/files/usr/bin/bash #!/bin/bash 를 지원하기 위한 특별한 처리가 있습니다.


Keith Thompson

/bin/sh 는 일반적으로 시스템의 기본 셸에 대한 링크입니다. 이는 종종 bash 이지만 예를 들어 Debian 시스템에서는 더 가벼운 dash 입니다. 어느 쪽이든 원래 Bourne 셸은 sh 이므로 스크립트가 일부 bash (2세대, "Bourne Again sh") 특정 기능( [[ ]] 테스트, 배열, 다양한 설탕 등)을 사용하는 경우에는 다음과 같아야 합니다. 더 구체적이고 나중에 사용합니다. 이렇게 하면 bash가 설치되지 않은 시스템에서 스크립트가 실행되지 않습니다. 나는 이 진화에 관한 흥미진진한 3부작의 영화가 있을 수 있다는 것을 이해합니다. 그러나 그것은 소문일 수 있습니다.

sh 로 호출될 때 bash 는 어느 정도 sh 로 동작합니다 (이에 대한 GNU 문서 참조).


CodeClown42

적절한 인터프리터를 호출하기 위해 shebang 라인을 사용하는 것은 BASH만을 위한 것이 아닙니다. Perl, Python, PHP(CLI) 및 기타 여러 언어와 같이 시스템에서 해석된 언어에 대해 shebang을 사용할 수 있습니다. 그건 그렇고, 시뱅

 #!/bin/sh -

(두 개의 대시가 될 수도 있습니다. 예를 들어 -- ) bash 옵션을 종료하면 이후의 모든 항목이 파일 이름과 인수로 처리됩니다.

env 명령을 사용하면 스크립트를 이식 가능하게 만들고 스크립트에 대한 사용자 정의 환경을 설정할 수 있으므로 이식 가능한 스크립트는 다음을 사용해야 합니다.

 #!/usr/bin/env bash

또는 Perl과 같은 언어에 대해

 #!/usr/bin/env perl

bash 에 대한 man 페이지를 확인하십시오.

 man bash

env :

 man env

참고: Ubuntu와 같은 Debian 및 Debian 기반 시스템에서 sh bash 아닌 dash 연결됩니다. 모든 시스템 스크립트는 sh 를 사용합니다. Debian에 따르면 이를 통해 bash가 성장하고 시스템이 안정적으로 유지될 수 있습니다.

또한 Windows에서와 같이 실행 파일에서 호출 시 확장자를 생략할 수 없기 때문에 Shebang 호출 스크립트에서 파일 확장자를 사용하지 않는 것처럼 *nix 호출을 유지합니다. file 명령은 이를 스크립트로 식별할 수 있습니다.


Jamie R Robillard Sr.

그것은 실제로 bash 스크립트를 작성하는 방법에 달려 있습니다. /bin/sh 가 bash에 심볼릭 링크되어 있는 경우 bash가 sh 로 호출될 때 일부 기능을 사용할 수 없습니다 .

bash 관련, POSIX가 아닌 기능을 원하면 #!/bin/bash


glenn jackman

#!/usr/bin/env 접근 방식에 한 표를 더 추가합니다. 저는 가상 환경을 많이 사용합니다. 제 경우에는 virtualenv에 설치된 python을 사용합니다. #!/usr/bin/python을 사용하는 것이 내가 원하는 파이썬이 아닐 수 있습니다. #!/usr/bin/env python을 사용하여 올바른 파이썬을 얻습니다.


Tom Ekberg

#!/bin/sh

대부분의 스크립트에는 특정 bash 기능이 필요하지 않으며 sh용으로 작성해야 합니다.

또한 기본적으로 bash가 없는 BSD에서 스크립트가 작동합니다.


weberjn

출처 : http:www.stackoverflow.com/questions/10376206/what-is-the-preferred-bash-shebang

반응형