"#!/usr/bin/envash"와 "#!/usr/bin/bash"의 차이점은 무엇입니까?
Bash 스크립트의 헤더에서 다음 두 문장의 차이점은 무엇입니까?
#!/usr/bin/env bash
#!/usr/bin/bash
가 상때담을했내가에 상담했을 때.env
man page, 나는 다음과 같은 정의를 이해합니다.
env - run a program in a modified environment
그것은 무엇을 뜻하나요?
를 통해 /usr/bin/env
에는 현재 환경에서 프로그램의 기본 버전을 찾을 수 있는 이점이 있습니다.
이렇게 하면 시스템의 특정 위치에서 경로를 찾을 필요가 없습니다. 경로가 서로 다른 시스템의 다른 위치에 있을 수 있기 때문입니다.당신의 길에 있는 한, 그것은 그것을 찾을 것입니다.
두 개 인수를 할 수 여러분은 예인통수것없다니입없는다음과할수를수상의이한개쓸두단가지점은예▁(▁one(다▁be것니없입▁will음▁ise▁more▁that▁argument▁write▁to▁unable▁you없다수는:한▁downside수▁than▁one▁be▁willg)/usr/bin/env awk -f
Linux를 지원하려면 POSIX가 줄을 해석하는 방법에 대해 모호하고 Linux는 첫 번째 공간 이후의 모든 것을 해석하여 단일 인수를 나타냅니다.사용할 수 있습니다./usr/bin/env -S
버는서전에의 일부 에서.env
이 문제를 해결하기 위해 스크립트는 훨씬 더 휴대성이 떨어지고 상당히 최근의 시스템(예: 나중에 Ubuntu 16.04도)에서 중단됩니다.
파일을 않기 때문에이 있고 사용자 보안할 수 입니다.bash
예를 들어).
#!/usr/bin/env bash #lends you some flexibility on different systems
#!/usr/bin/bash #gives you explicit control on a given system of what executable is called
경우에 따라 첫 번째가 선호될 수 있습니다(여러 버전의 파이썬으로 실행 가능한 줄을 다시 작성할 필요 없이 파이썬 스크립트를 실행하는 것과 같습니다).그러나 보안이 중요한 상황에서는 코드 주입 가능성을 제한하기 때문에 후자가 선호됩니다.
용사를 합니다.#!/usr/bin/env NAME
첫 항목에 셸 을 수행합니다.PATH 환경 변수에서 NAME의 첫 번째 일치 항목을 셸 검색합니다.절대 경로를 모르거나 검색을 원하지 않는 경우 유용할 수 있습니다.
가 셸스립다시경으로 #!/bin/bash
그들은 항상 함께 달릴 것입니다.bash
/bin
이 하만그시작면다로 시작한다면,#!/usr/bin/env bash
은 그은검것입다니할색들▁for를 검색할 입니다.bash
$PATH
그리고 나서 그들이 찾을 수 있는 첫 번째 것부터 시작합니다.
이것이 왜 유용할까요?▁run▁를 실행하려고 합니다.bash
4에 bash 4.x bash
의 배포판은 할 수 .3.x가 설치되어 있으며 현재 배포판에서 최신 버전을 제공하지 않거나 관리자가 아니므로 해당 시스템에 설치된 버전을 변경할 수 없습니다.
물론, 당신은 bash 소스 코드를 다운로드하고 처음부터 당신만의 bash를 구축할 수 있습니다.~/bin
예를들면.또한 다음을 수정할 수도 있습니다.$PATH
당신의 수가있에 ..bash_profile
을 ~/bin
첫 번째 항목으로(PATH=$HOME/bin:$PATH
~하듯이~
에서 $PATH
.bash
껍질은 먼저 그것을 찾을 것입니다.$PATH
순서대로, 그래서 그것은 시작합니다.~/bin
서 당신의 ▁your▁을 찾을 수 있습니다.bash
스크립트가 다음을 검색하는 경우에도 동일한 현상이 발생합니다.bash
용사를 #!/usr/bin/env bash
이제이스가사용정자사의작시다동스니합서에템용을 사용하여 에서 작동합니다.bash
체격이 좋은
한 가지 단점은 이로 인해 예기치 않은 동작이 발생할 수 있다는 것입니다. 예를 들어, 동일한 컴퓨터에서 동일한 스크립트가 서로 다른 환경 또는 서로 다른 검색 경로를 가진 사용자에 대해 서로 다른 인터프리터로 실행되어 모든 종류의 두통을 유발할 수 있습니다.
의 큰 단점은 단가큰입니다.env
할 수 것입니다.#!/usr/bin/env <interpreter> <arg>
<interpreter> <arg>
으로 (이다) 그래서 그주장으로서하따나라서의것, 다이다것인룰표.env
인 이지인검를다색니합터이터름리프정된▁ 검색합니다.<interpreter> <arg>
은 참로이문아다닙의 .env
변수를 할 수 이 줄을 호출하기도 전에 구문 하여 명령어 자체를 했습니다.env
한편, 대부분의 시스템에서 이 문제가 해결되었지만 스크립트가 울트라 포터블이 되기를 원한다면 실행할 시스템에서 이 문제가 해결되었다고 믿을 수 없습니다.
예를 들어, 보안에 영향을 미칠 수도 있습니다.sudo
되어 있지 않거나 "는 " 를 삭제합니다.$PATH
정리에서 제외되었습니다.이를 시연해 보겠습니다.
통보./bin
잘 보호된 곳일 뿐입니다.root
거기서 무엇이든 바꿀 수 있습니다.그러나 홈 디렉토리는 실행 중인 프로그램에서 변경할 수 없습니다.즉, 악성코드가 가짜를 만들어낼 수 있다는 뜻입니다.bash
의 겨진디리로렉터,당의신을 하세요..bash_profile
를 해당디포것는에 합니다.$PATH
따서모든스사용을 사용하는 모든 .#!/usr/bin/env bash
결국 그 가짜와 함께 도망칠 것입니다.bash
.한다면sudo
유지한다$PATH
당신은 큰 문제에 처해 있습니다.
를 들어, ": " " 를 합니다.~/.evil/bash
다음 내용을 포함합니다.
#!/bin/bash
if [ $EUID -eq 0 ]; then
echo "All your base are belong to us..."
# We are root - do whatever you want to do
fi
/bin/bash "$@"
스크립트를 sample.sh
:
#!/usr/bin/env bash
echo "Hello World"
개념 증명(시스템의 경우)sudo
유지한다$PATH
):
$ ./sample.sh
Hello World
$ sudo ./sample.sh
Hello World
$ export PATH="$HOME/.evil:$PATH"
$ ./sample.sh
Hello World
$ sudo ./sample.sh
All your base are belong to us...
Hello World
일반적으로 클래식 셸은 모두 다음 위치에 있어야 합니다./bin
그리고 어떤 이유로든 그들을 그곳에 배치하고 싶지 않다면, 심볼릭 링크를 배치하는 것은 정말 문제가 되지 않습니다./bin
그들의 실제 위치를 가리키는 것(또는 아마도)./bin
그 자체가 심볼릭 링크입니다. 그래서 저는 항상 함께 했습니다.#!/bin/sh
그리고.#!/bin/bash
이것들이 더 이상 작동하지 않는다면 부서질 것이 너무 많습니다.위치를 것은 . (.) 이 POSIX를 입니다./bin/sh
은 아마 아도여이것입다니할해히전마stand▁under▁still다▁probably것▁it니▁would를 이해할 것입니다.#!/bin/sh
기존 코드와의 호환성을 위해서만 사용할 수 있습니다.
그러나 Perl, PHP, Python 또는 Ruby와 같은 더 현대적이고 비표준적인 선택적인 인터프리터의 경우, 그것들이 어디에 위치해야 하는지는 실제로 명시되어 있지 않습니다.은 을있수있다니습▁be다▁in에 있을 수 있습니다./usr/bin
하지만 그들은 안에 있는 것이 좋을 것입니다./usr/local/bin
또는 완전히 다른 계층 분기(/opt/...
,/Applications/...
등).그것이 이들이 종종 사용하는 이유입니다.#!/usr/bin/env xxx
시방 구문
인터프리터에 대한 경로를 다음과 같이 명시적으로 정의하는 대신/usr/bin/bash/
env 명령을 사용하여 인터프리터를 검색하고 처음 찾은 곳에서 시작합니다.이것은 장단점이 있습니다.
env에 대해 몰랐을 때 스크립트를 작성하기 전에 다음과 같이 작업했기 때문에 유용하다고 생각합니다.
type nodejs > scriptname.js #or any other environment
파일에 있는 줄을 쉐방으로 수정하고 있었어요
에 있는지 이 했습니다. / 또는 /bin/, 는 nodejs라는 이름의 nodejs입니다. /usr/bin/라는 이름의 /usr/bin/라는 이름의 /bin/라는 이름의 /usr/bin/라는 이름의 nodejs입니다.env
매우 유용합니다. 내용이 , 이 제 입니다. ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ
한 가지 이유는 Linux와 BSD 모두에서 휴대할 수 있기 때문입니다.
언급URL : https://stackoverflow.com/questions/16365130/what-is-the-difference-between-usr-bin-env-bash-and-usr-bin-bash
'programing' 카테고리의 다른 글
mongoose 스키마 마이그레이션을 올바르게 처리하는 방법은 무엇입니까? (0) | 2023.05.01 |
---|---|
새 행에 대해서만 기본 NOW()가 있는 타임스탬프 열 (0) | 2023.05.01 |
Mongoose 모델에서 스키마 특성 가져오기 (0) | 2023.05.01 |
윈도우즈 Azure 가상 시스템 - 포트 열기 (0) | 2023.05.01 |
이클립스에서 내 프로젝트 옆에 빨간색 느낌표가 있는 이유는 무엇입니까? (0) | 2023.05.01 |