다른 프로세스의 환경 변수를 얻는 방법은 무엇입니까?

다른 프로세스의 환경 변수를 얻는 방법은 무엇입니까?

확인하면 /proc/1/environ프로세스 환경 변수에 대해 null 바이트로 구분된 문자열이 표시됩니다. 1이러한 변수를 현재 환경으로 가져오고 싶습니다. 찾을 수 있는 단축키가 있나요?

매뉴얼 proc페이지에서는 각 환경 변수를 한 줄씩 인쇄하는 데 도움이 되는 조각을 제공했습니다 (cat /proc/1/environ; echo) | tr '\000' '\n'. 이는 내용이 올바른지 확인하는 데 도움이 되지만 실제로 해야 할 일은 이러한 변수를 현재 bash 세션에 소스로 추가하는 것입니다.

어떻게 해야 하나요?

답변1

다음 코드는 각 환경 변수를 명령문으로 변환하고 export이를 올바르게 인용하여 셸로 읽은 다음( LS_COLORS예를 들어 세미콜론이 포함될 수 있음) 가져옵니다.

[안타깝게도 printfin 은 /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가 말했듯이 매우 간단합니다.명령 없이 입력 리디렉션 <FILEcat FILE매개변수 확장 후 .command 대체 출력 과 동일배너 ps:\000:"널 바이트로 분할"을 의미합니다. @이는 "전체 내용이 큰따옴표로 묶인 경우 각 배열 요소를 별도의 필드로 처리"함을 의미합니다(일반화 "$@"). )

배쉬, mksh

while IFS= read -r -d "" PWD; do export "$PWD"; done </proc/$pid/environ
PWD=$(pwd)

(이 셸에서 null 구분 기호를 전달하면 readnull 바이트가 구분 기호가 됩니다. 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 이외의 환경 변수는 지워지지 않는다는 점을 잊지 마십시오.

관련 정보