![매개변수가 확장된 함수를 내보내는 방법이 있나요?](https://linux55.com/image/198910/%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EA%B0%80%20%ED%99%95%EC%9E%A5%EB%90%9C%20%ED%95%A8%EC%88%98%EB%A5%BC%20%EB%82%B4%EB%B3%B4%EB%82%B4%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%B4%20%EC%9E%88%EB%82%98%EC%9A%94%3F.png)
두 개의 파일이 있다고 가정 해 봅시다메인 디렉토리그리고하위 디렉토리다음을 포함하는 동일한 폴더에:
메인.sh:
#!/usr/bin/env bash
export PARAMETER="main"
my_func(){
echo "$PARAMETER $1"
}
export -f my_func
# Run the other script
./sub.sh
하위.sh:
#!/usr/bin/env bash
PARAMETER="sub"
my_func $PARAMETER
main.sh를 실행하면 가 출력되지만 sub sub
저는 그렇게 하고 싶습니다 main sub
.
main.sh에 정의된 함수가 main.sh에 의해 시작된 스크립트에서 해당 매개변수 이름의 사용을 제한하지 않고 항상 main.sh에 선언된 값을 사용하도록 하는 방법이 있습니까? 저는 실제 문제에 sub.sh와 유사한 기능이 많이 있기 때문에 sub.sh를 수정할 필요가 없는 솔루션을 찾고 있습니다.
편집:
내 질문에 대한 답변이 제공되었지만 몇 가지 배경 정보는 다음과 같습니다.
main.sh
도커 이미지의 진입점 스크립트입니다. 이 진입점은 기본적 sub.sh
으로 큰 사례 설명이며 $1
스크립트 에 중복된 루틴을 다시 입력
하지 않아도 되도록 유틸리티 함수를 만들 생각입니다 . 나는 이미지에 sub.sh와 같은 스크립트를 추가하는 유일한 사람이 아니기 때문에 그것을 만지지 않으려고 합니다. 다른 개발자가 알 필요 없이 도구를 제공하고 싶습니다. 내 첫 번째 생각은 의 값을 고유한 이름을 가진 매개변수에 복사하는 것이었습니다 . 이렇게 하면 기능이 항상 예상대로 작동할 가능성이 높습니다. 이 시점에서 나는 매개변수가 확장된 함수를 내보낼 수 있을지 생각했습니다.main.sh
sub.sh
PARAMETER
my_func_PARAMETER
답변1
당신은 할 수만들다매개변수가 확장된 함수입니다. 나중에(전역적으로 또는 하위 쉘에서) 재정의할 수 있으므로 "확장된 매개변수를 사용하여 내보낼" 수 있습니다.
#!/usr/bin/env bash
export PARAMETER="main"
eval "my_func(){
echo \"$PARAMETER \$1\"
}"
export -f my_func
# Run the other script
./sub.sh
또는
#!/usr/bin/env bash
export PARAMETER="main"
my_func(){
echo "$PARAMETER $1"
}
export -f my_func
# Run the other script
(
eval "my_func(){
echo \"$PARAMETER \$1\"
}"
./sub.sh
)
분명히 이것은 별로 의미가 없습니다. 변수의 이전 내용을 사용하기 전까지는 변수를 덮어쓰지 않습니다.
#!/usr/bin/env bash
LOCAL_PARAMETER="sub"
my_func "$LOCAL_PARAMETER"