Bash 쉘의 /proc/*/environ을 변경하는 방법

Bash 쉘의 /proc/*/environ을 변경하는 방법

이것은 쉘의 PID입니다.

nathan@guixlaptop ~ $ $$
bash: 10984: command not found

환경 변수를 내보냅니다.

nathan@guixlaptop ~ $ export TESTVAR=test

쉘 환경에서 변수를 찾을 수 없습니다.

nathan@guixlaptop ~ $ cat /proc/10984/environ | grep TESTVAR || echo "fail"
fail

환경에 변수를 표시하는 방법은 무엇입니까?

답변1

/proc/.../environ프로세스의 초기 환경을 포함합니다.:

이 파일에는 현재 실행 중인 프로그램이 시작될 때 설정된 초기 환경이 포함되어 있습니다.execve(2).

...만약, 이후execve(2), 프로세스는 환경을 수정합니다(예: 다음과 같은 호출을 통해).putenv(3)또는 수정environ(7)직접 변수) 파일에는 이러한 변경 사항이 반영되지 않습니다.

변경 사항을 보려면 새 셸을 시작해야 합니다.

$ TESTVAR=test bash
$ grep TESTVAR /proc/$$/environ
grep: /proc/1825425/environ: binary file matches

environ침입적인 조치를 취하지 않으면 실행 중인 셸에 표시되는 내용을 변경할 수 없습니다 .프로세스 시작 후 /proc/PID/environ 변경더 알아보기.

답변2

NUL로 구분된 문자열을 처리한 다음 셸을 다시 시작하여 원하는 결과를 확인해야 한다고 생각합니다.

$ $$
bash: 9166: command not found 
$ export TESTVAR=test_question 

# at this point, you can check `/proc/9166/environ`, but `TESTVAR` won't show up until the shell is re-started 

$ tr '\0' '\n' < /proc/9166/environ
SHELL=/bin/bash
NO_AT_BRIDGE=1
PWD=/home/pi
LOGNAME=pi
# ... etc, etc - the env var TESTVAR is not there... 

$ tr '\0' '\n' < /proc/9166/environ | grep TESTVAR
$

# re-start bash & try again:

$ exec bash 

$ tr '\0' '\n' < /proc/9166/environ | grep TESTVAR
TESTVAR=test_question
$

@aviro 및 @stephenkitt에 따른 단순화(댓글 참조)

답변3

strings또 다른 예로 show proc/$$/environ 파일을 사용할 수 있습니다 .

strings /proc/$$/environ  # $$ mean current process PID,
                            # strings process newline characters in file.
strings /proc/$$/environ | grep USER
export TESTVAR=123
env |grep TSETVAR  # found
strings /proc/$$/environ | grep TESTVAR # not found

# new session
bash
strings /proc/$$/environ | grep TESTVAR # found

관련 정보