기본 PID와 관련된 전역 변수와 같은 쉘 간에 환경 변수를 공유하는 방법은 무엇입니까?

기본 PID와 관련된 전역 변수와 같은 쉘 간에 환경 변수를 공유하는 방법은 무엇입니까?

따라서 쉘 간에 환경 변수를 공유하고, 전역 변수와 마찬가지로 모든 쉘이 변수 변경 사항을 즉시 인식하도록 해야 합니다. 하지만 마스터 PID와 관련되어야 하므로 2개의 쉘 스크립트를 실행할 수 있습니다. 각각은 동일한 전역 변수 이름을 가진 마스터이고 그 하위 항목은 마스터 PID와 관련된 변수만 변경합니다.

bash스크립트 작성 에 사용합니다 .

현재 연구에는 다음이 포함됩니다.

기준 치수
모듈 프로젝트를 사용하여 이를 달성할 수 있다는 것을 읽었습니다.http://modules.sourceforge.net/, 그런데 이렇게 하려고 하는데 고민이 너무 많아서 예시가 부족한 것 같죠? 그리고 "모듈"은 너무나 일반적인 단어이기 때문에 다른 단어들과 너무 많이 섞여 있어서 구글링하기가 어렵습니다... 몇 주가 지난 후에도 제 손은 여전히 ​​비어 있습니다...

간단한 텍스트 소스 파일
flock또한 동시 쓰기를 방지하기 위해 변수를 저장/업데이트/읽기 위한 소스 스크립트 파일로 간단한 텍스트 파일을 사용해야 한다는 내용도 읽었습니다 . 그러나 그렇게 하면 두 개의 쉘이 동시에 변수를 변경하는 등 몇 가지 문제가 발생할 수 있습니다.

또는
쉘이 "전역" 변수를 읽은 후 다른 쉘이 이를 읽을 때까지 값을 유지한다는 것을 알고 있습니다. 그 동안 다른 쉘도 이를 변경할 수 있습니다.
아마도 매우 빠른 외부 응용 프로그램이 이러한 저장 공간을 제공할 수 있습니다. 환경 변수를 전역 변수로 사용하려고 하지 않나요? 하지만 제 생각엔 SQL 솔루션이 너무 느릴 것 같아요...

답변1

(include 명령)을 사용하여 환경을 파일에 쓰고 export -p다른 인스턴스에서 주기적으로 다시 읽을 수 있습니다. .하지만 아시다시피 동시 수정이 있으면 결과가 좋지 않습니다.

수정 사항을 즉시 전파하려면 export변경 사항을 다른 셸에도 전파하는 내장 함수 주위에 래퍼를 사용해야 합니다. Linux에서는 이 유틸리티를 사용할 수 있습니다 flock.

global_export () {
  {
    flock 0
    . /path/to/env
    [ $# -eq 0 ] || export "$@"
    export -p >/path/to/env
  } </path/to/env
}

global_export내보낸 변수에 새 값을 할당할 때마다 이 호출을 호출해야 합니다.

이것은 꽤 서투른 일이다. 아마도 문제를 해결하는 더 좋은 방법이 있을 것입니다. 가장 확실한 방법은 이러한 환경 변수를 사용하는 명령이 구성 파일을 읽도록 하는 것입니다.

답변2

Giles의 답변을 사용하는 대신 flock다음과 같은 작업을 수행합니다.

파일을 다시 로드하려면 신호 처리기를 등록하세요.

reload_env() {
 flock -s 3
 . /path/to/env
 flock -u 3
}
trap reload_env USR1

파일을 작성하고 SIGUSR1파일을 다시 로드하도록 알리는 함수를 모든 쉘에 보냅니다.

export_env() {
 flock 3
 export -p >/path/to/env
 flock -u 3
 fuser -k -USR1 /path/to/env
}

파일을 열지만 아무 작업도 수행하지 않습니다. 이는 fuser해당 쉘에 신호를 보낼 수 있도록 하기 위한 것입니다 .

exec 3>>/path/to/env

순서가 좀 중요해요. 최소한 이 exec ...섹션은 이 섹션 뒤에 와야 합니다 trap .... 그렇지 않으면 파일을 연 다음 fuser신호 처리기를 등록하기 전에 호출 신호를 받을 수 있습니다.

참고: 코드는 완전히 테스트되지 않았지만 원칙은 유지됩니다.
참고 2: 이 예제 코드는 bash용입니다.

답변3

fish쉘 과 함께 사용범용 범위 변수:

set -U var value

물론 이는 fish동일한 사용자가 실행하는 쉘에서만 작동합니다.

바인딩하고 싶다면마스터 PID, 변수 이름에 포함

set -U m${masterpid}var value

답변4

ksh93이 옵션인 경우 공유 스토리지에서 변수 값을 검색하거나 공유 스토리지에 저장할 수 있는 getter 및 setter 규칙 함수를 사용하여 원하는 것을 달성할 수 있는 방법이 있어야 합니다.

바라보다https://stackoverflow.com/questions/13726293/environment-variables-to-be-used-across-multiple-korn-ksh93-shell-scripts-get더 알아보기

다른 유용한 fish일반 변수 기능과 달리, 변수에 대한 단일 이름을 유지하면서 사용 사례의 일부 메커니즘에 의해 기본 PID에 연결된 일련의 프로세스로 값 공유를 제한하기 위해 구현에 액세스할 수 있습니다.

관련 정보