대부분의 용도에서 다른 것보다 객관적으로 더 나은 Bash
-
#!/usr/bin/env bash
-
#!/bin/bash
-
#!/bin/sh
-
#!/bin/sh -
- 등
오래전에 끝에 대시를 추가하면 누군가가 스크립트에 명령을 전달하는 것을 방지할 수 있다고 들었지만 이에 대한 자세한 내용은 찾을 수 없다는 것을 어렴풋이 기억합니다.
질문자 :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
가 아닙니다 .
다음을 사용하는 것이 좋습니다.
#!/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
를 지원하기 위한 특별한 처리가 있습니다.
/bin/sh
는 일반적으로 시스템의 기본 셸에 대한 링크입니다. 이는 종종 bash
이지만 예를 들어 Debian 시스템에서는 더 가벼운 dash
입니다. 어느 쪽이든 원래 Bourne 셸은 sh
이므로 스크립트가 일부 bash
(2세대, "Bourne Again sh") 특정 기능( [[ ]]
테스트, 배열, 다양한 설탕 등)을 사용하는 경우에는 다음과 같아야 합니다. 더 구체적이고 나중에 사용합니다. 이렇게 하면 bash가 설치되지 않은 시스템에서 스크립트가 실행되지 않습니다. 나는 이 진화에 관한 흥미진진한 3부작의 영화가 있을 수 있다는 것을 이해합니다. 그러나 그것은 소문일 수 있습니다.
적절한 인터프리터를 호출하기 위해 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 명령은 이를 스크립트로 식별할 수 있습니다.
그것은 실제로 bash 스크립트를 작성하는 방법에 달려 있습니다. /bin/sh
가 bash에 심볼릭 링크되어 있는 경우 bash가 sh
로 호출될 때 일부 기능을 사용할 수 없습니다 .
bash 관련, POSIX가 아닌 기능을 원하면 #!/bin/bash
#!/usr/bin/env 접근 방식에 한 표를 더 추가합니다. 저는 가상 환경을 많이 사용합니다. 제 경우에는 virtualenv에 설치된 python을 사용합니다. #!/usr/bin/python을 사용하는 것이 내가 원하는 파이썬이 아닐 수 있습니다. #!/usr/bin/env python을 사용하여 올바른 파이썬을 얻습니다.
#!/bin/sh
대부분의 스크립트에는 특정 bash 기능이 필요하지 않으며 sh용으로 작성해야 합니다.
또한 기본적으로 bash가 없는 BSD에서 스크립트가 작동합니다.
출처 : http:www.stackoverflow.com/questions/10376206/what-is-the-preferred-bash-shebang
T를 열거형으로 제한하는 제네릭 메서드 만들기 (0) | 2023.04.23 |
---|---|
다른 브랜치에서 Git에 브랜치 생성 (0) | 2023.04.23 |
부울 값을 저장하는 데 사용할 MySQL 데이터 유형 (0) | 2023.04.23 |
Git에서 파일을 언스테이징하는 두 가지 방법이 있는 이유는 무엇입니까? (0) | 2023.04.20 |
Windows에서 Git 리포지토리의 디렉터리 무시 (0) | 2023.04.20 |