내가 가지고 있다고 가정하자
export MY_VAR=0
존재하다 ~/.bashrc
.
그놈 터미널이 열려 있고 이 터미널에서 $MY_VAR
값을 200
.
echo $MY_VAR
이 터미널에서 200
표시합니다.
이제 그놈 터미널에서 다른 탭을 열고 실행했습니다.
echo $MY_VAR
...대신에 200
나는 가지고 있다 0
.
터미널이 환경 변수를 수정할 때 이 수정 사항(200으로 설정)이 모든 후속 하위 쉘 등에 사용 가능하도록 200 값을 유지하려면 어떻게 해야 합니까? 가능합니까?
답변1
ㅏ복사환경은 서브쉘로 전파되므로 다음과 같이 작동합니다.
$ export MY_VAR=200
$ bash
$ echo $MY_VAR
200
그러나 복사본이기 때문에 해당 값을 상위 셸에 전달할 수 없습니다. 적어도 환경을 변경하는 방법으로는 불가능합니다.
실제로 한 단계 더 나아가 Gnome 터미널의 새 탭과 같이 상위 쉘과 별도로 실행되는 "형제" 쉘이 공유하는 전역 변수와 같은 것을 생성하려는 것처럼 들립니다.
대부분의 경우 대답은 "환경 변수가 그런 식으로 작동하지 않기 때문에 할 수 없습니다"입니다. 그러나 또 다른 대답이 있습니다. 즉, 언제든지 무언가를 해킹할 수 있다는 것입니다. 한 가지 방법은 변수 값을 파일(예: )에 쓴 ~/.myvar
다음 이를 에 포함시키는 것 입니다 ~/.bashrc
.시작해당 파일에서 읽은 값입니다.
한 단계 더 나아갈 수 있습니다. ~/.myvar
format을 사용한 MYVAR=200
다음 set을 사용 PROMPT_COMMAND=source ~/.myvar
하면 새 프롬프트를 받을 때마다 값을 다시 읽게 됩니다. 아직은 아니야상당히공유 전역 변수이지만 실제처럼 작동하기 시작합니다. 그러나 프롬프트가 반환될 때까지 활성화되지 않으며 이는 수행하려는 작업에 따라 심각한 제한이 될 수 있습니다.
그리고 물론 다음 작업은 자동으로 수행됩니다.쓰다환경 변수는 실제로 쉘 간 통신 메커니즘 이 ~/.myvar
아니며 다른 방법을 찾는 것이 더 낫기 때문에 여기에서 멈추겠습니다.
답변2
내가
export MY_VAR=0
거기 있다고 가정해보자~/.bashrc
.
그것은 당신의 실수입니다. ~/.profile
로그인 시 읽어오는 환경변수를 에 정의해야 합니다 . ~/.bashrc
이 변수는 셸이 시작될 때마다 읽혀지며, 내부 셸을 시작할 때 덮어쓰여집니다 MY_VAR
. 이렇게 하지 않으면 환경 변수가 아래쪽으로 전파됩니다.
~/.bashrc
vs. 에 대한 자세한 내용 ~/.profile
은 내더 일찍
우편 존재하다 이것 주제.
알아채다위로전파(자식 셸에서 수정된 값을 가져오면 자동으로 상위 셸에 반영)가 불가능하며 완전히 중지됩니다.
답변3
생선 껍질은 다음을 수행할 수 있습니다.
set -U MY_VAR 0
(바라보다http://fishshell.com/docs/current/commands.html#set)
fish -c
다른 셸에서 Fish 명령을 실행하려면 다음과 같이 실행할 수 있습니다 .
fish -c "set -u MY_VAR 0"
답변4
방금 이 질문을 검색했을 때 서브셸 외부에서 상태(예: 셸 변수)를 업데이트하는 문제를 해결하려고 했습니다. 이 방법으로 변수는 파이프라인 내부에 할당될 수 있으며 할당은 상위 항목에 투명하게 표시됩니다.
물론 파이프라인의 일부가 fork
상위 셸에서 실행되어 다음과 같은 메모리를 갖는 하위 셸에서 실행되기 때문에 이는 간단한 방법으로는 불가능합니다.쓰기 중 복사부모님의 추억을 확인해 보세요. 하지만 슬림하고 투명한 솔루션이 가능하다고 생각합니다.공유 메모리"조금산업용 컴퓨터.
심지어 하나 찾았어구현하다정확히 이 디자인입니다...하지만 Perl로 작성되었습니다.
어쨌든 이 답변을 가능한 솔루션으로 추가하십시오.