소스 스크립트의 함수 동작

소스 스크립트의 함수 동작

script1.sh와 script2.sh 모두 이름은 같지만 정의가 다른 함수를 포함하는 경우 해당 함수가 script1.sh에서 실행되면 script2.sh는 script1.sh에서 시작됩니다. 어떤 함수가 호출될까요?

나는 이 사례를 시뮬레이션하려고 한다. script1.sh에서 함수를 실행하면 script1.sh에 정의된 함수만 사용됩니다. 그러나 이 동작은 모든 상황에서 일관됩니까?

script1.sh

#!/bin/bash
source script2.sh
execute() {
    echo "Hello"
}
execute

script2.sh

#!/bin/bash
execute() {
   echo "Something"
}

답변1

이 경우 함수를 변수로 처리할 수 있습니다. 즉, 함수에 할당한 마지막 값을 갖게 됩니다. 다음과 같은 경우가 있습니다.

var=foo
var=bar
var=baz
echo "$var"

위의 경우 변수에 값이 할당될 때마다 이전 값을 덮어쓰기 때문에 echo "$var"이것이 인쇄된다는 것이 분명할 것으로 기대합니다. baz기능은 동일한 방식으로 작동합니다. 동일한 이름을 가진 함수가 여러 번 정의되면 마지막 정의만 관련되고 다른 정의는 손실됩니다.

구매한다고 해서 달라지는 것은 아닙니다. 파일에서 함수를 가져온 다음 동일한 이름으로 새 함수를 재정의하면 새 함수만 작동합니다. 반대로, 스크립트에서 함수를 정의한 다음 동일한 이름의 함수를 사용하여 파일을 가져오는 경우 가져온 파일만 유효합니다.

그렇습니다. 완전히 일관성이 있으며 작업 순서에 따라 실제로 사용되는 것이 정의됩니다.

답변2

완전성을 위해 두 기능을 모두 사용하려면 네임스페이스를 사용할 수 있는 ksh93(쉘 bash가 에뮬레이션하려고 시도함)로 전환하면 됩니다.

다음을 수행하는 대신:

source script2.sh

(BTW, bash에서는 ksh와 마찬가지로 원하는 것이 없을 수도 있습니다.) 다음을 수행하십시오 script2.sh.$PATH

namespace script2 {
  source ./script2.sh # the one in the current directory not in $PATH!
}
function execute {
  echo "Hello"
}
execute           # the one from the global namespace
.script2.execute  # the one from the script2 namespace

변수 역시 네임스페이스로 지정된다는 점에 유의하세요.

관련 정보