bashrc에서 함수를 실행하지만 내보낸 변수를 수정합니다.

bashrc에서 함수를 실행하지만 내보낸 변수를 수정합니다.

매분마다 새로 고치고 변수를 외부화하는 bashrc의 함수를 실행하려고 합니다. 다음과 같습니다:

export CFN = ''
_some_fn
{
    export CFN = 'test'
    sleep 60
    _some_fn &
}
_some_fn &

'test'가 변수인 경우, 이것을 소싱할 때 함수 내부에서 CFN에 액세스할 수 없습니다. 이는 서브셸에서 실행 중이기 때문인 것으로 의심됩니다. 내보낸 CFN 값을 변경할 수 있는 방법이 있나요?

답변1

이는 현재 기능에서는 불가능합니다. 배경으로 설정하자마자 &프로세스 스택의 복사본을 가져와서 떠납니다. 해당 기능을 명시적으로 구축하지 않는 한 스택에 대한 변경 사항이 작업 복사본에 전파될 방법이 없으며, 함수 스택에 대한 변경 사항을 현재 스택으로 가져오는 것도 마찬가지로 불가능합니다.

변수를 변경하기 위해 일부 프로세스 간 통신을 설정할 수 있지만 올바른 작업은 항상 까다로우며 사용 사례가 무엇인지 잘 모르겠습니다. 양방향 IPC의 예:

mkfifo -m 600 /var/tmp/cfn-to-fn
mkfifo -m 600 /var/tmp/cfn-from-fn
export CFN = ''
_some_fn
{
     read CFN < /var/tmp/cfn-to-fn
     # do something with the new CFN here
     echo 'processed data' >/var/tmp/cfn-from-fn
     _some_fn &
}
_some_fn &
echo 'processme' > /var/tmp/cfn-to-fn
cat /var/tmp/cfn-from-fn

mkfifo에 대한 많은 대안이 있으며 일반적으로 모두 다음 태그 아래에 설명되어 있습니다.프로세스 간 통신. 일을 단순하게 유지하는 것이 장점이라면 이것에 신경 쓰지 말고 한쪽 끝에서는 파일에 데이터를 쓰고 다른 쪽에서는 읽으십시오. D-Bus는 TCP/ 또는 UDP/IP( netcat또는 ) 와 함께 대부분의 유닉스 시스템에서 큰 IPC 버스이지만 nc이를 사용하는 쉘 스크립트는 많이 본 적이 없습니다.

최종 대안은 이 모든 것을 그대로 두고 스크립트를 백그라운드 작업으로 실행하지 않고도 작동하도록 하여 실행 시 환경을 조정할 수 있도록 하는 것입니다.

관련 정보