스크립트에서 특정 파일 찾기

스크립트에서 특정 파일 찾기

함수가 다른 스크립트를 검색하고 발견되면 실행하는 스크립트 파일을 작성했습니다.

스크립트 발췌

#!/bin/bash
...
service_status() {
local my_script=`which my-services-check.sh 2>/dev/null`
[[ -z "$my_script" ]] && { echo -n "functionality not available" ; failure ; echo ; return ; }
source $my_script    
}
...

which my-services-check.sh 2>/dev/null터미널에서 이 작업을 수행 하면 파일에 대한 올바른 경로가 반환됩니다.

함수를 실행할 때서비스 상태()(스크립트가 호출될 때) 파일을 찾을 수 없습니다( $my_script비어 있음).

which나는 사용을 시도하지 않았지만 type결국 command같은 결과를 얻었습니다.

경로 문제

그런 다음 터미널과 스크립트에서 인쇄했는데 $PATH확실히 달랐습니다! 내 스크립트에서 실행될 때 $PATH아래 정의된 대로 안전한 경로로 설정 됩니다 /etc/sudoers.

Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

터미널에서 출발

echo $PATH /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin: ...

그래서,

  1. 내 스크립트 내에서 찾고 있는 파일을 어떻게 안정적으로 찾을 수 있나요? ( find필요한 파일이 경로에 있어야 하기 때문에 사용되지 않음)?

  2. 스크립트에서 실행할 때 PATH 설정이 다른 이유는 무엇입니까?

답변1

대화형 셸은 로드되지만 .bashrc스크립트는 로드되지 않습니다. 귀하의 $PATH설정이.bashrc 그리고 당신은 그것을 내보내지 않습니다, 스크립트는 변경 사항을 상속하지 않습니다 $PATH. 을 호출하면 export PATH스크립트에서 이를 확인해야 합니다 . export -p내보낸 변수를 확인하세요 ( $PATH해당 변수에 있어야 함). 또한 $BASH_ENV어느 것이 귀하에게 적용될 수 있는지 확인하십시오 $PATH.

이상적으로는 로그인할 때 로드 및 설정되고 해당 지점에서 실행하는 모든 항목에 표시되도록 $PATH설정하고 내보내야 합니다 ..profile

좋은 방법은 파일 이름이 존재하는지뿐만 아니라 올바른 파일인지 [[ -f "$my_script" ]]또는 (가져오기보다는 스크립트로 호출하려는 경우) 스위치를 확인하는 것입니다 -x.

답변2

실제로 포함된 보증은 없습니다 PATH. /bin그러나 그 밖의 모든 것이 가능하거나 가능합니다. 내 시스템의 사용자도 비슷한 것을 갖게 될 것입니다 $HOME/bin:/usr/local/bin:/bin:/usr/bin. 루트 사용자도 /usr/local/sbin:/sbin:/usr/sbin있습니다.

파일이 여러 위치 중 하나에 있을 수 있는 경우 해당 위치에서 파일을 검색할 수 있습니다. 이 검색에서 전체 종속성을 제거하거나 PATHPATH를 확장하여 스크립트를 찾을 수 있는 가장 작은 위치 집합을 포함하면 됩니다.

local OPATH="$PATH"
PATH="$PATH:/extra/place:/another/extra/place"
local my_script=$( which my-services-check.sh 2>/dev/null )
PATH="$OPATH" # Restore the original PATH (optional)

if test -z "$my_script"; then ...; fi
. "$my_script"

또는 PATH스크립트 상단에서 원하는 값을 설정하면 됩니다. 초기 스크립트가 실행되면 이를 설정하지 못할 이유가 없습니다 PATH. 저는 환경이 합리적이라는 것을 알기 위해 많은 스크립트에서 이 작업을 수행하는 경향이 있습니다.

관련 정보