#! / usr / bin / env bash가 #! / bin / bash보다 우수한 이유는 무엇입니까?
이 사이트에 대한 권고 (를 포함하여 여러 곳에서 본 적이 선호 배쉬 오두막을? 무엇을한다 ,)를 사용하기 #!/usr/bin/env bash
에 우선 #!/bin/bash
. 나는 진취적인 개인이 사용하는 #!/bin/bash
것이 잘못되었다는 것을 보았고 그렇게하면 bash 기능이 손실 될 것입니다.
모든 말은, 순환하는 모든 드라이브가 본질적으로 단일 마스터 드라이브의 복제 본인 엄격하게 통제 된 테스트 환경에서 bash를 사용하는 것입니다. 이식성 인수는 필자의 경우에 반드시 해당되는 것은 아니지만 이해합니다. #!/usr/bin/env bash
대안 을 선호하는 다른 이유가 있습니까? 이식성이 문제라고 가정하면 기능을 사용할 수없는 이유가 있습니까?
#!/usr/bin/env
검색 PATH
을위한 bash
, 그리고 bash
항상하지 /bin
특히 비 - 리눅스 시스템에서. 예를 들어, OpenBSD 시스템에서는 /usr/local/bin
옵션 패키지로 설치되었으므로에 있습니다.
당신이 절대적 경우 확인 bash
에 /bin
항상있을 것이다, 전혀 해를 끼치 지 당신에 직접 퍼팅 없다 오두막 -하지만 스크립트와 프로그램 모두 우리가 처음에 그들이 가지고있는 것으로 판단 것 이상의 삶을 가지고 있기 때문에 나는 반대 권하고 싶습니다.
bash의 표준 위치는 /bin
입니다. 모든 시스템에서 이것이 사실이라고 생각합니다. 그러나 해당 버전의 bash가 마음에 들지 않으면 어떻게해야합니까? 예를 들어 bash 4.2를 사용하고 싶지만 Mac의 bash는 3.2.5입니다.
bash를 다시 설치할 수는 /bin
있지만 나쁜 생각 일 수 있습니다. OS를 업데이트하면 덮어 씁니다.
그러나에 bash를 /usr/local/bin/bash
설치하고 PATH를 다음과 같이 설정할 수 있습니다.
PATH="/usr/local/bin:/bin:/usr/bin:$HOME/bin"
이제,을 지정 bash
하면에서 오래된 오래된 /bin/bash
것이 아니라 새롭고 빛나는 에서을 얻 습니다 /usr/local/bin
. 좋은!
내 쉘 스크립트를 제외하고는 !# /bin/bash
shebang이 있습니다. 따라서 쉘 스크립트를 실행할 때 연관 배열이없는 구식 버전의 bash를 얻습니다.
사용 /usr/bin/env bash
하면 내 PATH에있는 bash 버전이 사용 됩니다. PATH를 설정하여 /usr/local/bin/bash
실행하면 스크립트가 사용할 bash입니다.
bash로 이것을 보는 것은 드물지만 Perl과 Python에서는 훨씬 일반적입니다.
- 안정성에 중점을 둔 특정 유닉스 / 리눅스 릴리스 는 때때로이 두 스크립팅 언어의 출시로 뒤쳐져 있습니다. 얼마 전, RHEL의 Perl은 8 년 된 Perl 버전 인 5.8.8이었습니다! 더 현대적인 기능을 사용하려면 자신의 버전을 설치해야합니다.
- Perlbrew 및 Pythonbrew와 같은 프로그램을 사용하면 이러한 언어의 여러 버전을 설치할 수 있습니다. 원하는 버전을 얻기 위해 PATH를 조작하는 스크립트에 의존합니다. 경로를 하드 코딩하면 brew에서 스크립트를 실행할 수 없습니다 .
- 펄과 파이썬이 대부분의 유닉스 시스템에 포함 된 표준 패키지가 아니었던 것은 그리 오래 전이 아닙니다. 즉,이 두 프로그램이 어디에 설치되어 있는지 알 수 없었습니다. 아래에 있었습니까
/bin
?/usr/bin
?/opt/bin
? 누가 알아? 사용#! /usr/bin/env perl
한다는 것은 알 필요가 없다는 것을 의미했습니다.
그리고 왜 당신은 사용하지 않아야 #! /usr/bin/env bash
경로가 shebang에 하드 코딩되면 해당 인터프리터와 함께 실행해야합니다. 따라서 #! /bin/bash
기본 설치된 버전의 bash를 사용해야합니다. bash 기능은 매우 안정적이므로 (Python 3.x에서 2.x 버전의 Python 스크립트를 실행 해보십시오) 특정 BASH 스크립트가 작동하지 않을 가능성이 거의 없으며이 bash 스크립트가이 시스템 및 다른 시스템에서 사용되기 때문에 비표준 버전의 bash를 사용하면 원하지 않는 결과가 발생할 수 있습니다. 안정적인 표준 버전의 bash를 쉘 스크립트와 함께 사용하고 싶을 가능성이 큽니다. 따라서 아마도 내 shebang에서 경로를 하드 코딩하고 싶을 것입니다.
호출 bash
하는 것은 약간 과잉입니다. bash
~ / bin에 자신과 같은 바이너리 가 여러 개가 아니라면 코드에 올바른 것이있는 $ PATH에 의존한다는 것을 의미합니다.
python
그래도 편리합니다 . 대체 python
바이너리가 사용되는 랩퍼 스크립트 및 환경이 있습니다 .
그러나 이진 파일이 실제로 원하는 이진 파일이라고 확신하는 한 이진 파일의 정확한 경로를 사용하면 아무것도 손실되지 않습니다.
Bash in /bin
, FreeBSD 및 OpenBSD 가없는 시스템이 많이 있습니다 . 스크립트가 여러 다른 Unices에 이식 가능해야하는 경우 #!/usr/bin/env bash
대신 대신 사용할 수 있습니다 #!/bin/bash
.
이것은 사실이 아닙니다 sh
. Bourne의 호환 스크립트 나는 독점적으로 사용할 #!/bin/sh
내가이 존재 거의 모든 유닉스 생각하기 때문에, sh
에 /bin
.
#!/usr/bin/env bash
시스템 환경 변수에서 bash 실행 파일 경로를 찾기 때문에 확실히 좋습니다.
Linux 쉘로 이동하여 다음을 입력하십시오.
env
모든 환경 변수를 인쇄합니다.
쉘 스크립트로 이동하여 다음을 입력하십시오.
echo $bash.
스크립트에서 올바른 shebang 경로를 작성하는 데 사용해야하는 bash 경로 (환경 변수 목록에 따라)를 인쇄합니다.
bash
시스템에서 사용 가능한 모든 항목을 확인하려면 다음과 같은 스크립트로 기본 프로그램을 래핑하는 것이 좋습니다. 사용하는 버전을 더 잘 제어하는 것이 좋습니다.
#! /usr/bin/env bash
# This script just chooses the appropriate bash
# installed in system and executes testcode.main
readonly DESIRED_VERSION="5"
declare all_bash_installed_on_this_system
declare bash
if [ "${BASH_VERSINFO}" -ne "${DESIRED_VERSION}" ]
then
found=0
all_bash_installed_on_this_system="$(\
awk -F'/' '$NF == "bash"{print}' "/etc/shells"\
)"
for bash in $all_bash_installed_on_this_system
do
versinfo="$( $bash -c 'echo ${BASH_VERSINFO}' )"
[ "${versinfo}" -eq "${DESIRED_VERSION}" ] && { found=1 ; break;}
done
if [ "${found}" -ne 1 ]
then
echo "${DESIRED_VERSION} not available"
exit 1
fi
fi
$bash main_program "$@"
참고 URL : https://stackoverflow.com/questions/21612980/why-is-usr-bin-env-bash-superior-to-bin-bash
'IT story' 카테고리의 다른 글
read ()와 recv () 그리고 send ()와 write ()의 차이점은 무엇입니까? (0) | 2020.05.22 |
---|---|
캐치되지 않는 구문 에러 : 예기치 않은 토큰 : (0) | 2020.05.22 |
위임 키워드와 람다 표기법 (0) | 2020.05.22 |
JSON 객체로 TypeScript 객체를 초기화하는 방법 (0) | 2020.05.22 |
플러그인이 너무 오래되었습니다. 최신 버전으로 업데이트하거나 ANDROID_DAILY_OVERRIDE 환경 변수를 (0) | 2020.05.22 |