함수가 다른 스크립트를 검색하고 발견되면 실행하는 스크립트 파일을 작성했습니다.
스크립트 발췌
#!/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: ...
그래서,
내 스크립트 내에서 찾고 있는 파일을 어떻게 안정적으로 찾을 수 있나요? (
find
필요한 파일이 경로에 있어야 하기 때문에 사용되지 않음)?스크립트에서 실행할 때 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
있습니다.
파일이 여러 위치 중 하나에 있을 수 있는 경우 해당 위치에서 파일을 검색할 수 있습니다. 이 검색에서 전체 종속성을 제거하거나 PATH
PATH를 확장하여 스크립트를 찾을 수 있는 가장 작은 위치 집합을 포함하면 됩니다.
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
. 저는 환경이 합리적이라는 것을 알기 위해 많은 스크립트에서 이 작업을 수행하는 경향이 있습니다.