함수가 포함된 파일이 있고 foo
다음과 같은 흐름이 있는 경우 스크립트
A는 을 sources
포함 foo
하고 호출합니다 foo
.
그런 다음 foo
두 번째 스크립트도 동일한 파일을 소스로 사용합니다.
두 번째 스크립트에서 조건부로 파일을 가져오는 방법이 있는지 궁금합니다. 아니면 영향이 없으며 이 접근 방식이 일반적입니까?
답변1
스크립트 A가 다른 것을 실행하는 경우 프로그램은 함수 정의를 상속하지 않습니다. Bash에는 환경을 통해 함수를 내보낼 수 있는 모호한 기능이 있습니다. 이는 구현에 버그가 나타날 때까지 거의 알려지지 않았습니다. 꼭 필요한 경우 내보낸 함수를 사용할 수 있지만 export -f
환경에 존재하는 함수에 의존하기보다는 사용하고 싶은 함수만 정의하는 것이 더 좋습니다.
답변2
RalfFriedl이 이미 설명했듯이 이것이 영향을 미치는지 여부는 소스 스크립트 내에서 실제로 실행되는 내용에 따라 다릅니다. 스크립트의 내용을 알려주지 않으시기 때문에 이것이 영향을 미치는지 알 수 없습니다.
어쨌든, 두 번째 스크립트에서 이런 종류의 검사를 하는 것은 나쁜 디자인이라고 생각합니다. 소스 스크립트는 멱등적 방식으로 작성되어야 합니다. 어떠한 불이익도 없이 가능한 한 자주 스크립트를 소스로 사용할 수 있어야 합니다.
우리가 "한 번만" 일어나기를 원하는 일은 거의 없습니다. 일반적인 상황은 PATH
ie 또는 에 일부 내용을 추가하는 것 입니다 LD_LIBRARY_PATH
. 스크립트를 여러 번 가져오면 경로가 점점 길어집니다. 이를 방지하려면 소스 스크립트가 아닌 소스 스크립트로 보호해야 합니다. 내가 자주 사용하는 패턴은 다음과 같습니다.
# Put /foo/bar on top of PATH
: ${_src_xyz_version:=1}
if [[ ${_SRC_XYZ:=0} != $_src_xyz_version ]]
then
export _SRC_XYZ=$_src_xyz_version
export PATH=/foo/bar:$PATH
fi
이 경우 PATH가 확장되면 내 프로세스 또는 하위 프로세스에서 스크립트를 다시 실행해도 PATH가 다시 수정되지 않습니다.~하지 않는 한프로세스는 다음을 수행하여 요청을 명시적으로 변경합니다.
export _SRC_XYZ=0