#!/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/bash
PATH를 사용하다
PATH="/usr/local/bin:/bin:/usr/bin:$HOME/bin"
''를 하면 '''를 합니다.bash
옛날의 지저분한 건 이해가 안 가/bin/bash
, 단단에 있는 것, , , , , 、 , , 、 , , , 。/usr/local/bin
★★★★★★★★★★★★★★★★★★!
셸 것을 !# /bin/bash
배열도 따라서 셸 스크립트를 실행하면 연관 배열도 없는 낡고 형편없는 버전의 bash가 나타납니다.
「」를 사용합니다./usr/bin/env bash
PATH에 합니다.하면 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
는 두 경우에 합니다.
- 호환되지 않는 여러 버전의 인터프리터가 있는 경우.
를 들어, 「」입니다.python
2
/3
,perl
4
/5
, 「」php
5
/7
- 이 「」에 의존하는 .
PATH
python python python python python python python python.
그러나 bash는 다음 두 가지 경우 중 하나에 해당하지 않습니다.
bash
은 특히 와 같은 현대 입니다.이 시스템은 Linux BSD의 하고 있습니다.bash
인스톨 합니다.- 한
bash
에 설치되다/bin
.
이는 지난 20년 이상에 걸쳐 존재해 온 사례로, (더 이상 아무도 사용하지 않는) 매우 오래된 유니크만이 다른 위치를 가지고 있었습니다.
결과, 음, 음, 음, 음, 음, 음, 음, consequ, consequ, consequ, consequ, consequ, consequ, consequ을 거치게 됩니다.PATH
에 의해 변화하다/usr/bin/env
는 bash에 도움이 .
「3」을 사용합니다.#!/bin/bash
:
- 스크립트의 (「」를 하지 않는 )
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
뭔가 이상한 이유 때문에 - 의 ""를 때"
PATH
초심자에게 매우 흔한 일입니다. - 예를 들어 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
및 합니다.env
NAME=VALUE
pair.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
'programing' 카테고리의 다른 글
C#을 사용한 Excel Automation에서 상행 프리즈 및 필터 적용 방법 (0) | 2023.04.15 |
---|---|
git: 치명적:원격 저장소에서 읽을 수 없습니다. (0) | 2023.04.15 |
Python 3에서 파일 내용을 처리할 때 "TypeError: "str"이 아닌 바이트와 유사한 개체가 필요합니다." (0) | 2023.04.15 |
SQL Replace 함수 내부의 정규식 패턴입니까? (0) | 2023.04.15 |
Git Push 오류: 저장소 데이터베이스에 개체를 추가할 수 있는 권한이 없습니다. (0) | 2023.04.15 |