확인하면 /proc/1/environ
프로세스 환경 변수에 대해 null 바이트로 구분된 문자열이 표시됩니다. 1
이러한 변수를 현재 환경으로 가져오고 싶습니다. 찾을 수 있는 단축키가 있나요?
매뉴얼 proc
페이지에서는 각 환경 변수를 한 줄씩 인쇄하는 데 도움이 되는 조각을 제공했습니다 (cat /proc/1/environ; echo) | tr '\000' '\n'
. 이는 내용이 올바른지 확인하는 데 도움이 되지만 실제로 해야 할 일은 이러한 변수를 현재 bash 세션에 소스로 추가하는 것입니다.
어떻게 해야 하나요?
답변1
다음 코드는 각 환경 변수를 명령문으로 변환하고 export
이를 올바르게 인용하여 셸로 읽은 다음( LS_COLORS
예를 들어 세미콜론이 포함될 수 있음) 가져옵니다.
[안타깝게도 printf
in 은 /usr/bin
일반적으로 지원되지 않으므로 %q
내장 bash
. ]
. <(xargs -0 bash -c 'printf "export %q\n" "$@"' -- < /proc/nnn/environ)
답변2
bash
다음을 수행할 수 있습니다 . 이는 변수의 가능한 모든 내용에 대해 작동하며 다음을 방지합니다 eval
.
while IFS= read -rd '' var; do declare +x "$var"; done </proc/$PID/environ
이는 실행 중인 쉘에서 읽기 변수를 쉘 변수로 선언합니다. 실행 중인 셸 환경으로 변수를 내보내려면 다음 안내를 따르세요.
while IFS= read -rd '' var; do export "$var"; done </proc/$PID/environ
답변3
/proc/$pid/environ
이 답변에서는 변수 정의 사이에 null 바이트가 있고 지정된 PID를 사용하여 프로세스 컨텍스트를 반환하는 시스템을 가정합니다 . (리눅스, 시그윈, 솔라리스(?)).
지쉬
export "${(@ps:\000:)$(</proc/$pid/environ)}"
(zsh가 말했듯이 매우 간단합니다.명령 없이 입력 리디렉션 <FILE
cat FILE
매개변수 확장 후 .command 대체 출력 과 동일배너 ps:\000:
"널 바이트로 분할"을 의미합니다. @
이는 "전체 내용이 큰따옴표로 묶인 경우 각 배열 요소를 별도의 필드로 처리"함을 의미합니다(일반화 "$@"
). )
배쉬, mksh
while IFS= read -r -d "" PWD; do export "$PWD"; done </proc/$pid/environ
PWD=$(pwd)
(이 셸에서 null 구분 기호를 전달하면 read
null 바이트가 구분 기호가 됩니다. PWD
결국 가져올 수 있는 다른 변수가 손상되는 것을 방지하기 위해 이를 임시 변수 이름으로 사용합니다. 기술적으로 PWD
가져올 수도 있지만 그대로 유지됩니다. 다음까지 동일 cd
).
POSIX
POSIX 이식성은 Curve가 있는 시스템에만 적용되므로 /proc/PID/environ
현재/proc/PID/environ
지원될 수 있으므로 이 질문에서는 그다지 흥미롭지 않습니다. Linux에서 GNU Utilities와 BusyBox는 모두 null로부터 안전하지만 몇 가지 주의 사항이 있습니다.
POSIX 이식성을 정말로 주장한다면 널 바이트를 처리하기 위해 POSIX 텍스트 유틸리티가 필요하지 않을 것이므로 이것이 어려울 것입니다. 이는 awk가 널 바이트를 레코드 구분 기호로 지원한다고 가정하는 솔루션입니다(nawk 및 gawk는 지원하지만 BusyBox awk는 지원하지만 mawk는 지원하지 않음).
eval $(</proc/$pid/environ awk -v RS='\0' '{gsub("\047", "\047\\\047\047"); print "export \047" $0 "\047"}')
BusyBox awk(임베디드 Linux 시스템에서 일반적으로 사용되는 버전)는 null 바이트를 지원하지만 블록 내 설정 RS
이나 위의 명령줄 구문을 지원하지 않습니다. 그러나 이유는 조사되지 않았습니다. 내 버전의 버그(Debian wheezy)."\0"
BEGIN
-v 'RS="\0"'
(값 내에서 작은따옴표를 이스케이프 처리한 후 null로 구분된 모든 레코드를 작은따옴표로 묶습니다 .)"\047"
지침
이들 중 하나가 읽기 전용 변수를 설정하려고 시도할 수 있다는 점에 유의하십시오(셸에 읽기 전용 변수가 있는 경우).
답변4
사용 source
및프로세스 교체:
source <(sed -r -e 's/([^\x00]*)\x00/export \1\n/g' /proc/1/environ)
곧:
. <(sed -r -e 's/([^\x00]*)\x00/export \1\n/g' /proc/1/environ)
사용 eval
및명령 대체:
eval `sed -r -e 's/([^\x00]*)\x00/export \1\n/g' /proc/1/environ`
이 sed
호출은 다음 awk
호출로 대체될 수 있습니다.
awk -vRS='\x00' '{ print "export", $0 }' /proc/1/environ
그러나 pid 1 이외의 환경 변수는 지워지지 않는다는 점을 잊지 마십시오.