bash 함수 - 변수 내부에서 함수의 표준 출력 값을 가져오고 함수 외부에서 변수를 수정합니다.

bash 함수 - 변수 내부에서 함수의 표준 출력 값을 가져오고 함수 외부에서 변수를 수정합니다.

특정 요구로 인해 bash 함수의 모든 stdout 출력을 변수("F_MY_FUNC_R")에 저장해야 하지만 다음을 기반으로 일부 변수("VAL_A" 및 "VAL_B")의 값을 수정하는 함수도 필요합니다. 아래 코드.

질문:VAL_A 및 VAL_B 변수가 수정되지 않은 이유는 무엇입니까? 해결책이 있나요?

암호

VAL_A="none"
VAL_B="none"
f_my_func() {
    echo "some info some info some info some info some info "
    echo "some info some info some info some info some info "
    echo "some info some info some info some info some info "
    echo "some info some info some info some info some info "
    VAL_A="some value"
    VAL_B="some value"
}
F_MY_FUNC_R=$(f_my_func)
echo "$F_MY_FUNC_R"
echo "$VAL_A"
echo "$VAL_B"

산출

[root@localhost some_folder]# echo "$F_MY_FUNC_R"
some info some info some info some info some info 
some info some info some info some info some info 
some info some info some info some info some info 
some info some info some info some info some info 
[root@localhost some_folder]# echo "$VAL_A"
none
[root@localhost some_folder]# echo "$VAL_B"
none

감사해요! =디

답변1

서브쉘은 쉘의 기본 규칙입니다.할 수 없다상위 변수 또는 환경을 수정합니다. 서브셸 내에서 함수를 실행하는 것은 $(f_my_func)이 규칙의 영향을 받으며 상위 변수 VAL_A 및 VAL_B는 변경되지 않습니다.

함수의 상위 변수를 정말로 변경해야 하는 경우 함수의 출력을 캡처하는 대신 출력을 다른 변수로 설정하십시오.

VAL_A="none"
VAL_B="none"
f_my_func() {
    nl=$'\n'
    F_MY_FUNC_R="some info some info some info some info some info $nl"
    F_MY_FUNC_R+="some info some info some info some info some info $nl"
    F_MY_FUNC_R+="some info some info some info some info some info $nl"
    F_MY_FUNC_R+="some info some info some info some info some info "
    VAL_A="some value"
    VAL_B="some value"
}
f_my_func
echo "$F_MY_FUNC_R"
echo "$VAL_A"
echo "$VAL_B"

답변2

이것이 나의 "더러운" 해결책입니다... =D

노트:echo내가 말했듯이 내 실제 기능은 크기 때문에 해당 기능의 출력을 (기본적으로) 계속 사용하고 싶습니다 F_MY_FUNC_OP. 그 외에도 내 로깅 체계는 F_MY_FUNC_OP많은 레거시 구성 요소를 사용하고 구성합니다.

VAL_A="none"
VAL_B="none"
f_my_func() {
    echo "$(date)"
    VAL_A="some value"
    VAL_B="some value"
}
f_my_func > f_my_func_op 2>&1
F_MY_FUNC_OP=$(cat f_my_func_op)
rm -f "f_my_func_op"
echo "$F_MY_FUNC_OP"
echo "$VAL_A"
echo "$VAL_B"

이렇게 하면 함수를 실행하고 해당 stderr 및 stdout을 파일로 리디렉션할 수 있으며, 함수 외부의 변수("$VAL_A" 및 "$VAL_B"의 경우)를 조작할 수 있습니다. 그렇지 않으면("F_MY_FUNC_OP= 예: $(f_my_func )" 또는 "F_MY_FUNC_OP=`f_my_func`") 함수는 "하위 쉘"에서 실행되며 이러한 변수에는 작동할 수 없습니다.

@jesse_b, @AdminBee 및 @Isaac에게 감사드립니다!=디

관련 정보