한 쉘 인스턴스의 환경 변수를 다른 쉘 인스턴스에서 설정하는 데 관심이 있습니다. 그래서 연구를하기로 결정했습니다. 읽은 후 수 의 질문 에 대한 이 나는 그것을 테스트하기로 결정했다.
나는 두 개의 쉘 A와 B (PID 420)를 생성했으며 둘 다 실행 중 zsh
입니다. 쉘 AI에서 다음을 실행했습니다.
sudo gdb -p 420
(gdb) call setenv("FOO", "bar", 1)
(gdb) detach
셸 B에서 실행 env
하면 변수 FOO가 실제로 bar 값으로 설정되어 있음을 알 수 있습니다. 이것은 쉘 B의 환경에서 FOO가 성공적으로 초기화되었다고 생각합니다. 그러나 FOO를 인쇄하려고하면 빈 줄이 설정되어 있지 않음을 나타냅니다. 나에게는 모순이있는 것처럼 느낍니다.
이것은 내 자신의 Arch GNU / Linux 시스템과 Ubuntu VM 모두에서 테스트되었습니다. 또한 bash
변수가 env에 표시되지 않은 곳 에서도 이것을 테스트했습니다 . 이것은 나에게 실망 스럽지만 쉘이 생성시 환경의 사본을 캐시하고 그 링크 만 사용하면 (연관된 질문 중 하나에서 제안 된) 의미가 있습니다. 이것은 여전히 zsh
변수를 볼 수있는 이유에 대한 답변이 아닙니다 .
출력이 왜 echo $FOO
비어 있습니까?
편집하다
의견을 입력 한 후 조금 더 테스트하기로 결정했습니다. 결과는 아래 표에서 확인할 수 있습니다. 첫 번째 열에는 FOO
변수가 주입 된 쉘이 있습니다. 첫 번째 행에는 그 아래에 출력을 볼 수있는 명령이 포함됩니다. 변수 FOO
는 다음을 사용하여 주입되었습니다 sudo gdb -p 420 -batch -ex 'call setenv("FOO", "bar", 1)'
. zsh :에 특정한 명령 zsh -c '...'
은 bash를 사용하여 테스트되었습니다. 결과는 동일했고 결과는 간결하게 생략되었습니다.
아치 GNU / 리눅스, zsh 5.3.1, bash 4.4.12 (1)
| | env | grep FOO | echo $FOO | zsh -c 'env | grep FOO' | zsh -c 'echo $FOO' | After export FOO |
|------|------------------|-----------|---------------------------|----------------------|-----------------------------------|
| zsh | FOO=bar | | FOO=bar | bar | No Change |
| bash | | bar | | | Value of FOO visible in all tests |
우분투 16.04.2 LTS, zsh 5.1.1, bash 4.3.48 (1)
| | env | grep FOO | echo $FOO | zsh -c 'env | grep FOO' | zsh -c 'echo $FOO' | After export FOO |
|------|------------------|-----------|---------------------------|----------------------|-----------------------------------|
| zsh | FOO=bar | | FOO=bar | bar | No Change |
| bash | | bar | | | Value of FOO visible in all tests |
위의 결과는 분포에 무관심하다는 것을 암시하는 것 같습니다. 이것은 더 이상 말하지 않습니다 zsh
및 bash
다른 변수의 핸들을 설정. 또한 export FOO
셸에 따라이 컨텍스트에서 동작이 매우 다릅니다. 이 테스트가 다른 사람에게 분명한 것이 될 수 있기를 바랍니다.
env
:)는 수정 된 환경을 봅니다.
zsh
했으며 GDB에서 환경 변수를 설정하면 셸 변수로 표시되지 않지만 자식 프로세스에 전달됩니다 ( 당신은 하나 설정하는 동안,)를 관찰 bash
않은 쉘 변수로 볼 수 있도록를하지만 않습니다 하지 그것은 자식 프로세스에 전달하는 원인! zsh와 bash는 환경 관리가 아닌 변수를 추적하는 zsh와 (서브 쉘이 아닌) 자식을 시작할 때 살균하는 환경에 모든 것을 저장하는 bash와 함께 변수 관리를 위해 다른 전략을 사용하는 것처럼 보입니다.
export FOO
에서 bash
?
zsh -c 'echo $FOO'
대신 작은 따옴표를 사용 하면 어떻게됩니까 ? 그때 볼 수 있습니까?