PATH 환경 변수를 사용하여 호출

PATH 환경 변수를 사용하여 호출

동료와 토론 중입니다. 쉘 스크립트(예: 설치 스크립트, cronjob 등)에서 명령에 대한 전체 경로를 명시적으로 지정하는 것이 더 낫거나 필요한가요?

예를 들어, 스크립트 사용자가 시스템을 설정했을 수 있습니다(또는 해킹당했을 수 있습니다(이 경우 모든 베팅이 실패할 수 있음)). 동일한 이름의 명령이 시스템의 다른 곳에 존재하고 스크립트가 의존하는 명령보다 이전 명령 검색 경로는 예기치 않거나 바람직하지 않은 결과를 생성할 수 있습니다.

스크립트가 예상된 명령을 사용하도록 전체 경로를 지정하는 것이 가치가 있습니까, 아니면 지나치게 생각하고 있습니까?

답변1

이는 상황에 따라 다르며 두 옵션 모두 장점과 단점이 있습니다. 일반적으로 나는 아주 특별한 이유가 없는 한 절대 경로를 사용하지 않을 것입니다.

PATH 환경 변수를 사용하여 호출

절대 경로를 지정하지 않고 명령을 호출하면(IE는 PATH디렉토리에 있는 명령을 사용함) 스크립트의 이식성이 향상됩니다. 이는 의 프로그램에서는 문제가 될 가능성이 적지만 /bin사용하려는 모든 명령에서는 확실히 그렇습니다 /usr/bin. 다양한 시스템에서 /opt또는 와 같은 다양한 위치에 배치할 수 있습니다 /snap.

설상가상으로 사용자는 다양한 이유로 경로를 구성할 수 있습니다. 여기에는 여러 Java 런타임 또는 Python 버전 설치 등이 포함될 수 있습니다. 따라서 시스템 관리자가 스크립트와 호환되지 않는 버전을 설치했을 수 있으므로 호출이 java거의 발생해서는 안 됩니다 . /usr/bin/java사용자가 사용할 Java 버전을 선택할 수 있도록 하는 것이 중요합니다.

또 다른 예는 일부 배포판이 예상한 규칙을 반드시 따르지는 않는다는 것입니다. 실제로 Archlinux는 /bin /sbin /usr/bin /usr/sbin모든 것을 다른 디렉토리에 대한 심볼릭 링크를 사용하여 하나의 디렉토리에 묶었습니다(이봐). 이는 이전 버전과 호환되어야 하지만 일부 표준은 생각만큼 일반적이지 않음을 보여줍니다.

다음과 같은 도구에 유의하세요.스도내장된 PATH 환경 변수에 대한 특정 보호 기능이 있으므로 절대 경로를 지정하지 않더라도 일반적으로 sudo로 실행해야 하는 스크립트가 안전하다고 가정하는 것이 안전합니다.


절대 경로를 사용하여 호출

일반적으로 절대 경로는 매우 구체적인 이유가 있는 경우에만 사용하십시오.

절대 경로를 사용하는 주요 이점은 실행 중인 명령을 더 효과적으로 제어할 수 있다는 것입니다. 여기에서 사용자 지정 경로를 재정의하도록 설계된 특정 대체 도구를 설치할 수 있습니다.

보안 문제를 지적하셨습니다. 이를 수행하는 방법은 여러 가지가 있지만 언급한 대로 sudo명령을 실행하는 것은 거의 문제가 되지 않습니다.

cron 스크립트를 언급하셨습니다. 유명한 cron의 PATH 환경 변수에는 예상대로 설정되지 않는 경우가 많다는 점에서 문제가 있습니다(이봐). 나는 과거에 cron과 함께 사용하기 위해 절대 경로가 포함된 스크립트를 작성했습니다. 이것은 그것을 설치한 시스템 관리자를 신뢰하지 않는 것과 더 관련이 있습니다. 저는 항상 스크립트의 절대 경로보다는 잘 설정된 PATH를 사용하여 크론 작업을 실행하는 것을 선호합니다.

답변2

허용되는 답변 외에도 절대 경로를 사용하는 또 다른 효과를 추가하고 싶습니다.셸 내장 명령의 사용을 방지합니다.

예를 들어:

  • echo:shell은 내장 echo명령을 사용 echo하거나 PATH.
  • /bin/echo: 쉘이 이 프로그램을 사용하도록 강제합니다. 이 프로그램은 내장 명령보다 약간 더 비쌉니다.

보다목록Bash의 기타 내장 명령.

내장 명령에 대한 두 가지 질문이 있습니다.

POSIX허용하다쉘은 표준 명령을 내장 명령으로 구현합니다."일반적으로 사용되는 유틸리티의 성능을 향상하거나 독립형 환경에서 더 어려운 기능을 구현하는 것",표준에서는 내장 기능이 실행될 것으로 예상하지만오직검색에서 외부 명령을 사용할 수 있는 PATH경우많은 구현에서는 그렇지 않은 것 같습니다..

또한 내장된 구현이 항상 표준을 준수하는 것은 아닙니다. 예를 들어,POSIX는 printf다음보다 권장합니다.echo후자는 휴대성이 떨어지기 때문입니다.

편집: 유용한 정보로 업데이트됨구석에.

관련 정보