모든 하위 쉘에서 사용 가능하고 수정할 수 있도록 env 변수를 내 보냅니다.


22

내가 가지고 있다고 가정

export MY_VAR=0

에서 ~/.bashrc.

그놈 터미널을 열었으며이 터미널에서 $MY_VAR값을로 변경 합니다 200. 그래서 만약 내가

echo $MY_VAR

이 터미널에는 200이 표시되어 있습니다.

그놈 터미널에서 다른 탭을 열었습니다.

echo $MY_VAR

... 그리고 대신에 200있습니다 0.

터미널이 환경 변수를 수정할 때 200 값을 유지하여이 후속 수정 (200으로 설정)을 모든 후속 서브 쉘 등에서 사용할 수있게하려면 어떻게해야합니까? 이것이 가능한가?

답변:


23

환경 의 복사본 이 하위 셸로 전파되므로 다음과 같이 작동합니다.

$ export MY_VAR=200
$ bash
$ echo $MY_VAR
200

그러나 사본이기 때문에 최소한 환경을 변경하는 것이 아니라 부모 쉘까지 그 값을 얻을 수 없습니다.

실제로 한 걸음 더 나아가고 자하는 것처럼 들리는데, 이는 Gnome Terminal의 새 탭처럼 부모와 별도로 시작된 "형제"쉘이 공유하는 전역 변수처럼 작동하는 것을 만드는 것입니다.

대부분의 대답은 "환경 변수가 그렇게 작동하지 않기 때문에 할 수 없습니다"입니다. 그러나 또 다른 대답이 있습니다. 즉, 항상 무언가를 해킹 할 수 있습니다. 한 가지 방법은 변수 값을 파일에 쓰는 ~/.myvar다음에 포함하는 것입니다 ~/.bashrc. 그런 다음 각 새 쉘은 해당 파일에서 읽은 값으로 시작 합니다.

한 단계 더 나아갈 수 ~/.myvar있습니다. 형식으로 MYVAR=200설정 한 다음 설정 PROMPT_COMMAND=source ~/.myvar하면 새 프롬프트가 표시 될 때마다 값을 다시 읽게됩니다. 아직 아닙니다 확실히 공유 전역 변수,하지만처럼 행동하기 시작하고있다. 그러나 프롬프트가 다시 나타날 때까지 활성화되지 않습니다. 수행하려는 작업에 따라 심각한 제한이있을 수 있습니다.

물론 다음으로 변경 사항을 자동으로 작성하는 것입니다 ~/.myvar. 실제로는 환경 변수가 쉘 간 통신 메커니즘이 아니기 때문에 다른 방법을 찾는 것이 더 낫기 때문에이 시점에서 조금 더 복잡해집니다.


10
고문 아래에서 삐걱 거리는 소리가 들린다

그래 미안 그래서 제가 멈췄습니다. :)
mattdm

"글로벌 변수처럼 행동하는 것을 만드는 것"-글쎄, 그것이 내가 달성하려고하는 것입니다. ~ / .myvar는 예쁘지 않지만 작동합니다. 다른 제안이 있습니까?
누군가 아직도 당신을 사용합니다 MS-DOS

2
음, 조금 뒤로 물러 갑시다. 전역 변수를 원하는 이유는 무엇입니까?
mattdm

1
@ mattdm : 나는 준수해야 할 "관료주의"가 있습니다. 그중 하나는 주석과 함께 커밋 해야하는 많은 코드입니다. 이러한 코드는 이제 폴더 계층 구조 (home / user / projects / projectcode / code1 / code2)에 있습니다. 나는 env vars에 code1과 code2를 추출하는 함수를 만들었습니다 (따라서 활동을해야 할 때 코드로 dir 내부의 함수를 호출합니다). 이 변수를 읽고 자동으로 주석을 넣으십시오. 나는 그것을 위해 파일을 사용하는 것이 해결책이 될 수 있다고 생각합니다.
누군가 아직도 당신을 사용합니다 MS-DOS

13

내가 가진 가정 export MY_VAR=0에서 ~/.bashrc.

그것은 바로 당신의 실수입니다. ~/.profile로그인 할 때 읽히는 환경 변수를로 정의해야합니다 . ~/.bashrc쉘을 시작할 때마다 읽습니다. 내부 셸을 시작하면을 (를) 재정의 MY_VAR합니다. 그렇게하지 않으면 환경 변수가 아래쪽으로 전파됩니다.

~/.bashrcvs 에 대한 자세한 내용 항목 에 대한 이전 게시물 ~/.profile 참조하십시오 .

그 주 (자동으로 부모 쉘에 반영 서브 쉘에서 수정 된 값을 받고) 전파하는 것은, 마침표 수 없습니다.



3

환경 변수를 전혀 사용하지 마십시오. 파일을 사용하십시오.

파일을 업데이트 / 읽을 때 프로세스가 서로 밟 히지 않도록하려면 잠금 파일과 파일이 잠겨 있지 않은 경우 $ 1로 파일을 업데이트하는 소형 프런트 엔드 업데이트 프로그램 스크립트를 사용하십시오. 잠금 파일은 기본적으로 특정 파일이 있는지 (/var/run/yourscript.lck) 확인하고 존재하는 경우 파일이 잠시 사라질 때까지 기다렸다가 실패하면 실패합니다. 또한 파일 업데이트가 완료되면 잠금 파일을 삭제해야합니다.

파일이 사용 중이므로 스크립트가 파일을 업데이트 할 수없는 상황을 처리 할 수 ​​있도록 준비하십시오.


8
트릭 : mkdir원자 테스트 및 작성으로 작동 하므로 잠금 대신 파일 대신 디렉토리를 사용하십시오.
mattdm

1
여러분이 잠금에 대해 이야기하고 싶다면 다음을 사용하십시오.flock(2)
Ehtesh Choudhury

@ mattdm 나는 ln -s dummy lockfile심볼릭 링크가 이미 존재하면 실패 할 것이므로 심볼 링크 (깨진 경우에도)도 작동 할 수 있음을 발견했습니다 . 그것이 정말로 100 % 안전한지 테스트하는 방법이 궁금합니다.
물병 자리 힘

1

이 질문을 방금 검색했을 때 서브 쉘에서 상태 (예 : 쉘 변수)를 업데이트하는 문제를 해결하려고했습니다. 예를 들어 파이프 라인 내부에 변수를 할당 할 수 있으며 할당은 부모에게 투명하게 표시됩니다.

물론 파이프 라인의 개별 부분이 fork부모 셸에서 가져온 하위 셸에서 실행되므로 부모 메모리 에서 쓰기시 복사 보기 인 메모리가 있기 때문에 간단한 방법으로는 불가능합니다 . 그러나 " 공유 메모리 "종류의 IPC를 기반으로 얇고 투명한 솔루션이 가능하다고 생각했습니다 .

그리고 나는 이 디자인 의 구현 을 찾았습니다 ... 그러나 그것은 Perl에 있습니다.

어쨌든 가능한 해결책 으로이 답변을 추가하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.