쉘 스크립트에서 언어 해석기는 shebang() 라인에서 지정할 수 있습니다 #!
. 내가 아는 한, 항상 디렉토리에 위치하지만 #!/usr/bin/env bash
위치 는 시스템마다 다를 수 있으므로 사용하는 것이 좋습니다. 그러나 유틸리티를 사용하여 직접 실행 하거나 유틸리티를 통해 실행 하는 경우 기술적인 차이가 있습니까 ? 또한 변수를 지정하지 않으면 수정되지 않은 환경에서 실행 됩니다 . 맞나요?env
/usr/bin
bash
bash
/bin/bash
env
env
bash
답변1
를 사용하는 것은 해당 경로 가 환경에 지정되므로 해당 경로 ( , , 또는 모든 경로)가 관련이 없다는 env
의미에서 "이식 가능"하다고 간주될 수 있습니다 . 이러한 방식으로 스크립트 작성자는 자신의 스크립트를 다양한 시스템에서 더 쉽게 실행할 수 있도록 만들 수 있습니다.bash
/bin/bash
/usr/bin/bash
/usr/local/bin/bash
~/bin/bash
다른 의미에서, env
find bash
나 다른 셸 또는 명령 해석기를 사용하는 것은 알 수 없는 바이너리(악성 프로그램)가 스크립트를 실행하는 데 사용될 수 있으므로 보안 위험으로 간주됩니다. 이러한 환경에서는 때때로 관리 정책에 따라 경로가 전체 경로를 사용하여 명시적으로 지정됩니다 #!/bin/bash
.
일반적으로 env
위험 세부 사항을 면밀히 조사하는 환경 중 하나에서 글을 쓰고 있다는 사실을 알지 못하는 경우에는 이 방법을 사용하십시오.
2011년에 Ubuntu가 처음 사용되기 시작했을 때 dash
이 작업으로 인해 많은 스크립트가 손상되었습니다. 이에 대해서는 askubuntu.com에서 논의됩니다. 대부분의 스크립트는 #!/bin/sh
링크를 통해 작성 됩니다 /bin/bash
. 합의는 다음과 같습니다. 스크립트 작성자는 인터프리터를 지정할 책임이 있습니다. 따라서 스크립트가 항상 BASH 호출을 사용해야 하는 경우 환경에서 이를 지정하십시오. 이렇게 하면 다양한 Unix/Linux 시스템에서 다를 수 있는 경로를 추측할 필요가 없습니다. 또한 내일 /bin/sh
이 /bin/newsh
.
또 다른 차이점은 이 env
방법에서는 매개변수가 인터프리터에 전달되는 것을 허용하지 않는다는 것입니다.
답변2
사용 속도가 약간 느려지는 것 외에는 /usr/bin/env
이와 같은 프로그램을 실행해도 아무런 차이가 없습니다. ( /bin/bash
존재하지 않지만 bash
경로 어딘가에 있는 경우는 제외)
env
명령이 호출되는 환경을 수정하는 것은 가능하지만 env
명령줄에서 실행하는 경우에만 Shebang 줄에서 옵션을 지정할 수 없습니다(운영 체제에 따라 다름).
이것원천env
꽤 작기 때문에 C에 익숙하다면 그것이 무엇을 하는지 확인할 수 있습니다. 이후 execvp
실행될 프로그램을 호출하는 데 사용됩니다. env
프로세스 트리를 확인하면 상위 프로세스도 없을 것입니다.