programing

#!/usr/bin/env bash가 #!/bin/bash보다 우월한 이유는 무엇입니까?

css3 2023. 4. 15. 09:10

#!/usr/bin/env bash가 #!/bin/bash보다 우월한 이유는 무엇입니까?

이 사이트에서 사용하는 권장 사항(Bash shebang은 무엇입니까?)을 포함한 많은 장소에서 보았습니다.#!/usr/bin/env bash에에보다 #!/bin/bash한 진취적인 개인이 사용하는 것이 잘못되어 bash 기능이 상실될 수 있다고 제안하는 것을 본 적도 있습니다.

이 모든 것은 유통되는 모든 드라이브가 기본적으로 단일 마스터 드라이브의 복제품인 엄격히 통제된 테스트 환경에서 bash를 사용합니다.휴대성에 더 선호하는 요?#!/usr/bin/env bash휴대성에 문제가 있다고 가정했을 때, 이 기능을 손상시킬 수 있는 이유가 있습니까?

#!/usr/bin/env 기능PATH★★★★★★에bash , , , , 입니다.bash 있는 것은 /bin(특히 Linux 이외의 시스템에서는)예를 들어 OpenB에서 시스템, SD에 ./usr/local/bin이치노

bash/bin앞으로도 계속됩니다.하지만 스크립트와 프로그램은 모두 당초 예상했던 것보다 더 많은 삶을 살기 때문에 반대할 것을 권장합니다.

는 bash입니다./bin모든 시스템에 해당한다고 생각합니다.하지만, 만약 당신이 그 버전의 bash를 좋아하지 않는다면?bash 4.2 bash 3.2 bash 3.2.5 bash 3.2.5.

./bin 됩니다OS os os os os os os os 。

는 bash, bash는 bash에 할 수 ./usr/local/bin/bashPATH를 사용하다

PATH="/usr/local/bin:/bin:/usr/bin:$HOME/bin"

''를 하면 '''를 합니다.bash옛날의 지저분한 건 이해가 안 가/bin/bash, 단단에 있는 것, , , , , 、 , , 、 , , , 。/usr/local/bin★★★★★★★★★★★★★★★★★★!

셸 것을 !# /bin/bash배열도 따라서 셸 스크립트를 실행하면 연관 배열도 없는 낡고 형편없는 버전의 bash가 나타납니다.

「」를 사용합니다./usr/bin/env bashPATH에 합니다.하면 PATH는/usr/local/bin/bash쾅쾅거리다

bash에서는 거의 볼 수 없지만 Perl과 Python에서는 훨씬 더 일반적입니다.

  • 안정성에 중점을 둔 특정 Unix/Linux 릴리스는 이들 2개의 스크립트 언어 릴리스보다 훨씬 늦어질 수 있습니다.얼마 전 RHEL의 Perl은 5.8.8로 8년 전의 Perl 버전입니다.누군가가 더 현대적인 기능을 사용하고 싶다면, 당신은 당신만의 버전을 설치해야 했다.
  • Perlbrew 및 Pythonbrew와 같은 프로그램을 사용하면 이러한 언어의 여러 버전을 설치할 수 있습니다.PATH를 조작하여 원하는 버전을 취득하는 스크립트에 의존합니다.경로를 하드 코딩한다는 건 내 스크립트를 실행할 수 없다는 뜻이지
  • Perl과 Python이 대부분의 Unix 시스템에 포함된 표준 패키지가 아닌 것은 그리 오래 전 일이 아닙니다.즉, 이 2개의 프로그램이 어디에 설치되어 있는지 알 수 없었습니다. 밑에 요?/bin무슨 일입니까?/usr/bin무슨 일입니까?/opt/bin누가 알겠어?사용.#! /usr/bin/env perl요필는는는는는는는 츠요시

왜 '안 #! /usr/bin/env bash

때문 」는, 「 」라고 하는 것입니다.#! /bin/bash는 기본 설치된 버전의 bash를 사용하도록 강제합니다.안정적이기 3.2.x), 하지 않을 , 이다른 되고 있을 때문에 하면 바람직하지 않은효과가 할 수 .bash는 python (3일)x에서 Python 스크립트의 2.x 버전을 실행해 보십시오), 특정 BASH 스크립트가 작동하지 않을 가능성이 매우 높으며, bash 스크립트가 이 시스템과 다른 시스템에서 사용되고 있기 때문에 비표준 버전의 bash를 사용하는 것은 바람직하지 않은 영향을 미칠 수 있습니다.셸 스크립트에서 안정적인 표준 버전의 bash를 사용하고 싶은 경우가 많습니다.그래서 나는 아마도 내 셰방에서 경로를 하드코드로 만들고 싶어.

./bin 및 , FreeBSD » OpenBSDKKEE M&A를 사용합니다.를 여러 "Unice"를 사용할 수 .#!/usr/bin/env bash#!/bin/bash.

은, 은음음, 음음음음 음음 note note note note note note note note note note note note note note note note note note note note note 에는 되지 않는 해 주세요.sh Bourne , 는 배타적으로 Bourne을 사용합니다.#!/bin/sh가 Unix를 가지고 있다고 sh/bin.

" " 를 호출하는 bash여러 개를 가지고 않는 한bash~/bin의 바이너리와 같은 바이너리는 $PATH에 올바른 것이 포함되어 있는지 여부에 따라 코드가 달라집니다.

그것은 다음과 같은 것에 편리하다.python 나 환경이 .그래서 래퍼 스크립트나 래퍼 환경이 있습니다.python사용 중인 바이너리

그러나 원하는 바이너리만 확인하면 바이너리에 대한 정확한 경로를 사용하여 손실되는 것은 없습니다.

 #!/usr/bin/env bash

시스템 환경변수에서 bash 실행 가능 경로를 찾기 때문에 이 방법이 더 좋습니다.

Linux 쉘로 이동하여

env

환경변수가 모두 출력됩니다.

셸 스크립트로 이동하여 입력

echo $BASH

스크립트에 올바른 shebang 경로를 구축하기 위해 사용해야 하는 bash 경로를 (환경 변수 목록에 따라) 인쇄합니다.

입니다.이기 때문입니다.#!/usr/bin/env bash에 있다#!/bin/bash은 사실이그 이유는 과 같습니다.그 이유는 다음과 같습니다.

env는 두 경우에 합니다.

  1. 호환되지 않는 여러 버전의 인터프리터가 있는 경우.
    를 들어, 「」입니다.python 2/3,perl 4/5 , 「」php 5/7
  2. 이 「」에 의존하는 .PATHpython python python python python python python python.

그러나 bash는 다음 두 가지 경우 중 하나에 해당하지 않습니다.

  1. bash은 특히 와 같은 현대 입니다.이 시스템은 Linux BSD의 하고 있습니다.bash인스톨 합니다.
  2. bash에 설치되다/bin.
    이는 지난 20년 이상에 걸쳐 존재해 온 사례로, (더 이상 아무도 사용하지 않는) 매우 오래된 유니크만이 다른 위치를 가지고 있었습니다.

결과, 음, 음, 음, 음, 음, 음, 음, consequ, consequ, consequ, consequ, consequ, consequ, consequ을 거치게 됩니다.PATH에 의해 변화하다/usr/bin/env는 bash에 도움이 .

「3」을 사용합니다.#!/bin/bash:

  1. 스크립트의 (「」를 하지 않는 )sh)는, 그 PATH에는, 「이러다」를 포함할 수 ./bin.
    를 들어, 「」입니다.cron한 「」입니다.PATH/usr/bin:/bin괜찮지만, 에는 론론환환환, 환환환환환환환/환환환환환환환환 which which which which which which which which which which which which which which which which which which which which which which 가 포함되지 않을 수도 있습니다./bin뭔가 이상한 이유 때문에
  2. 의 ""를 때"PATH초심자에게 매우 흔한 일입니다.
  3. 예를 들어 bash 스크립트를 호출하는 suid 프로그램을 호출할 때 보안을 위해 사용됩니다.이 통역을 것이 .PATH사용자가 완전히 제어할 수 있는 변수!

마지막으로, 한 가지 정당한 사용 사례가 있다고 주장할 수 있습니다.env을 낳다bash: "를 사용합니다.#!/usr/bin/env -S VAR=value bash.
하지만 이건 우리만의 문제가 아니야bash셰방을 할 할 수 '셰방'을 해 주세요.VAR=value.env scripts를 합니다.

프로그램을 .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 "$@"

일반적으로 #!path/to/command는 실행 시 bash를 트리거하여 호출 스크립트에 대한 명령 경로를 추가합니다.예,

# file.sh
#!/usr/bin/bash
echo hi

./file.sh됩니다./bin/bash ./file.sh

지금이다

# file.sh
#!/usr/bin/env bash
echo hi

/usr/bin/env bash ./file.sh하면 다음과 같습니다. man 페 페 의 의 음 의 의 음 음 음 음 음 음 음 음 음 음 음 음 음 음。

env - 변경된 환경에서 프로그램 실행

★★★★★★★★★★★★★★★★★.env.bash PATH 및 합니다.envNAME=VALUEpair.pair.pair.pair.

python 등의 다른 인터프리터를 사용하여 다른 스크립트를 사용하여 테스트할 수 있습니다.

#!/usr/bin/env python
# python commands

언급URL : https://stackoverflow.com/questions/21612980/why-is-usr-bin-env-bash-superior-to-bin-bash