νƒœκ·Έ 보관물: environment-variables

environment-variables

λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ ν™˜κ²½ λ³€μˆ˜λ₯Ό μ–΄λ–»κ²Œ μ†Œμ‹±ν•©λ‹ˆκΉŒ? 수 μžˆμŠ΅λ‹ˆλ‹€ . 이 λ³€μˆ˜λ₯Ό

검사 /proc/1/environν•˜λ©΄ null λ°”μ΄νŠΈλ‘œ ꡬ뢄 된 ν”„λ‘œμ„ΈμŠ€ 1ν™˜κ²½ λ³€μˆ˜ λ¬Έμžμ—΄μ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€ . 이 λ³€μˆ˜λ₯Ό ν˜„μž¬ ν™˜κ²½μœΌλ‘œ κ°€μ Έμ˜€κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. 이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” μ‰¬μš΄ 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

proc맀뉴얼 νŽ˜μ΄μ§€ λ‚˜μ—κ²Œ λΌμΈλ³„λ‘œ 각각의 ν™˜κ²½ λ³€μˆ˜λ₯Ό 좜λ ₯ ν•  데 λ„μ›€μ΄λ˜λŠ” 미리보기λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€ (cat /proc/1/environ; echo) | tr '\000' '\n'. 이것은 λ‚΄μš©μ΄ μ˜¬λ°”λ₯Έμ§€ ν™•μΈν•˜λŠ” 데 λ„μ›€μ΄λ˜μ§€λ§Œ μ‹€μ œλ‘œν•΄μ•Ό ν•  일은 μ΄λŸ¬ν•œ λ³€μˆ˜λ₯Ό ν˜„μž¬ bash μ„Έμ…˜μœΌλ‘œ κ°€μ Έ μ˜€λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ–΄λ–»κ²Œν•©λ‹ˆκΉŒ?



λ‹΅λ³€

λ‹€μŒμ€ 각 ν™˜κ²½ λ³€μˆ˜λ₯Ό exportλͺ…λ Ήλ¬Έ 으둜 λ³€ν™˜ ν•˜κ³  μ‰˜λ‘œ 읽기 μœ„ν•΄ μ˜¬λ°”λ₯΄κ²Œ 인용 ν•œ λ‹€μŒ μΈμš©ν•©λ‹ˆλ‹€ ( LS_COLORS예 : μ„Έλ―Έμ½œλ‘ μ΄ ν¬ν•¨λ˜μ–΄ 있기 λ•Œλ¬Έμ—).

[ μ•ˆνƒ€κΉκ²Œλ„ printfin은 /usr/bin일반적으둜 μ§€μ›ν•˜μ§€ μ•ŠμœΌλ―€λ‘œμ— %qλ‚΄μž₯ 된 것을 ν˜ΈμΆœν•΄μ•Όν•©λ‹ˆλ‹€ bash.]

. <(xargs -0 bash -c 'printf "export %q\n" "$@"' -- < /proc/nnn/environ)

λ‹΅λ³€

μ—μ„œ 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

λ‹΅λ³€

이 λ‹΅λ³€μ—μ„œλŠ” /proc/$pid/environλ³€μˆ˜ μ •μ˜ 사이에 null λ°”μ΄νŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ μ§€μ •λœ PID둜 ν”„λ‘œμ„ΈμŠ€ ν™˜κ²½μ„ λ°˜ν™˜ ν•˜λŠ” μ‹œμŠ€ν…œμ„ κ°€μ •ν•©λ‹ˆλ‹€ . ( λ”°λΌμ„œ Linux, Cygwin λ˜λŠ” Solaris (?) ).

Zsh

export "${(@ps:\000:)$(</proc/$pid/environ)}"

(zshκ°€ μ§„ν–‰ν•˜λŠ” κ²ƒμ²˜λŸΌ 맀우 간단 ν•©λ‹ˆλ‹€ . λͺ…λ Ή <FILE 이 μ—†λŠ” μž…λ ₯ λ¦¬λ””λ ‰μ…˜ 은에 ν•΄λ‹Ήν•©λ‹ˆλ‹€ cat FILE. λͺ…λ Ή λŒ€μ²΄μ˜ 좜λ ₯은 β€œnull λ°”μ΄νŠΈμ— λΆ„ν• β€μ΄λΌλŠ” ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•˜μ—¬ 맀개 λ³€μˆ˜ ν™•μž₯을 μˆ˜ν–‰ν•˜κ³  β€œμ „μ²΄κ°€ 큰 λ”°μ˜΄ν‘œλ‘œ 묢인 경우 각 λ°°μ—΄ μš”μ†Œλ₯Ό λ³„λ„μ˜ ν•„λ“œλ‘œ β€œ(μΌλ°˜ν™” ).)ps:\000:@"$@"

배쉬, mksh

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

(이 μ…Έμ—μ„œ 빈 ꡬ뢄 κΈ°ν˜Έκ°€ μ „λ‹¬λ˜λ©΄ readnull λ°”μ΄νŠΈκ°€ ꡬ뢄 κΈ°ν˜Έκ°€λ©λ‹ˆλ‹€. PWDκ°€μ Έ 였기 PWD둜 끝날 μˆ˜μžˆλŠ” λ‹€λ₯Έ λ³€μˆ˜λ₯Ό λ°©ν•΄ν•˜μ§€ μ•ŠκΈ° μœ„ν•΄ μž„μ‹œ λ³€μˆ˜ μ΄λ¦„μœΌλ‘œ μ‚¬μš© ν•©λ‹ˆλ‹€. 기술적으둜 κ°€μ Έμ˜¬ μˆ˜λŠ” μžˆμ§€λ§Œ 계속 κ°€μ Έμ˜¬ λ•ŒκΉŒμ§€λ§Œ μœ μ§€λ©λ‹ˆλ‹€. λ‹€μŒ cd.)

POSIX

POSIX 이식성은이 μ§ˆλ¬Έμ— ν₯λ―Έλ‘­μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ™œλƒν•˜λ©΄μ΄ μ‹œμŠ€ν…œμ€ /proc/PID/environ. κ·Έλž˜μ„œ λ¬Έμ œλŠ” μ†”λΌλ¦¬μŠ€ sedκ°€ μ§€μ›ν•˜λŠ” 것, λ˜λŠ” μ†”λΌλ¦¬μŠ€μ˜ 지원 μ—¬λΆ€μž…λ‹ˆλ‹€. /proc/PID/environν•˜μ§€λ§Œ μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ μš”μ¦˜μ—λŠ” μ†”λΌλ¦¬μŠ€ κΈ°λŠ₯에 뒀쳐져 μžˆμŠ΅λ‹ˆλ‹€. Linuxμ—μ„œ GNU μœ ν‹Έλ¦¬ν‹°μ™€ BusyBoxλŠ” λͺ¨λ‘ 널 μ•ˆμ „ν•˜μ§€λ§Œ κ²½κ³ κ°€ μžˆμŠ΅λ‹ˆλ‹€.

POSIX 이식성을 κ³ μ§‘ν•œλ‹€λ©΄ POSIX ν…μŠ€νŠΈ μœ ν‹Έλ¦¬ν‹° 쀑 μ–΄λŠ 것도 널 λ°”μ΄νŠΈλ₯Ό 처리 ν•  ν•„μš”κ°€ μ—†μœΌλ―€λ‘œ 이것은 μ–΄λ ΅λ‹€. λ‹€μŒμ€ awkκ°€ λ ˆμ½”λ“œ ꡬ뢄 기호둜 null λ°”μ΄νŠΈλ₯Ό μ§€μ›ν•œλ‹€κ³  κ°€μ •ν•˜λŠ” μ†”λ£¨μ…˜μž…λ‹ˆλ‹€ (BuckyBox awk와 λ§ˆμ°¬κ°€μ§€λ‘œ nawk 및 gawkλŠ” μˆ˜ν–‰ν•˜μ§€λ§Œ mawkλŠ” κ·Έλ ‡μ§€ μ•ŠμŠ΅λ‹ˆλ‹€).

eval $(</proc/$pid/environ awk -v RS='\0' '{gsub("\047", "\047\\\047\047"); print "export \047" $0 "\047"}')

(일반적으둜 λ‚΄μž₯ν˜• λ¦¬λˆ…μŠ€ μ‹œμŠ€ν…œμ—μ„œ 발견 된 버전)의 λΉ„μ§€ λ°•μŠ€ AWK 지원 NULL의 λ°”μ΄νŠΈμ΄μ§€λ§Œ μ„€μ •ν•˜μ§€ μ•ŠλŠ” RS둜 "\0"(A)에 BEGINμ—†λŠ” λͺ…λ Ή ν–‰ ꡬ μœ„μ— 블둝과; κ·ΈλŸ¬λ‚˜ 그것은 지원 -v 'RS="\0"'ν•©λ‹ˆλ‹€. λ‚˜λŠ” μ™œ λ‚΄ 버전 (Debian wheezy)의 λ²„κ·Έμ²˜λŸΌ λ³΄μ΄λŠ”μ§€ μ‘°μ‚¬ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

( μž‘μ€ λ”°μ˜΄ν‘œλ₯Ό κ°’ λ‚΄λΆ€λ‘œ μ΄μŠ€μΌ€μ΄ν”„ ν•œ ν›„ λͺ¨λ“  ν–‰μ—μ„œ λ„λ‘œ 뢄리 된 λ ˆμ½”λ“œλ₯Ό μž‘μ€ λ”°μ˜΄ν‘œλ‘œ λ¬ΆμœΌμ‹­μ‹œμ˜€ "\047".)

κ²½κ³ 

이 쀑 ν•˜λ‚˜λΌλ„ 읽기 μ „μš© λ³€μˆ˜λ₯Ό μ„€μ •ν•˜λ €κ³  μ‹œλ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€ (μ‰˜μ— 읽기 μ „μš© λ³€μˆ˜κ°€μžˆλŠ” 경우).


λ‹΅λ³€

λ‚˜λŠ” μ΄κ²ƒμœΌλ‘œ λΉ™κΈ€ λΉ™κΈ€ κ°”λ‹€. null λ°”μ΄νŠΈμ˜ 이식성에 μ’Œμ ˆν–ˆμŠ΅λ‹ˆλ‹€. μ‰˜μ—μ„œ 처리 ν•  μˆ˜μžˆλŠ” ν™•μ‹€ν•œ 방법이 μ—†λ‹€λŠ” 것은 λ‚˜μ™€ ν•¨κ»˜ 잘 앉아 μžˆμ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‚˜λŠ” 계속 μ°Ύκ³  μžˆμ—ˆλ‹€. 진싀은 λ‚΄κ°€ 이것을 ν•  μˆ˜μžˆλŠ” λͺ‡ κ°€μ§€ 방법을 μ°Ύμ•˜λ‹€λŠ” 것인데, 그쀑 두 κ°€μ§€λ§Œμ΄ λ‚΄ λŒ€λ‹΅μ— λ‚˜μ™€ μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ κ²°κ³ΌλŠ” λ‹€μŒκ³Ό 같이 μž‘λ™ν•˜λŠ” 적어도 두 개의 μ‰˜ ν•¨μˆ˜μ˜€μŠ΅λ‹ˆλ‹€.

_pidenv ${psrc=$$} ; _zedlmt <$near_any_type_of_file

λ¨Όμ € \0ꡬ뢄 에 λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜κ² μŠ΅λ‹ˆλ‹€ . μ‹€μ œλ‘œλŠ” 맀우 μ‰½μŠ΅λ‹ˆλ‹€. κΈ°λŠ₯은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

_zedlmt() { od -t x1 -w1 -v  | sed -n '
    /.* \(..\)$/s//\1/
    /00/!{H;b};s///
    x;s/\n/\\x/gp;x;h'
}

기본적 odμ–»μ–΄ stdinκ·Έ μ“°λŠ” stdout각 λ°”μ΄νŠΈκ°€ 라인 λ‹Ή μ§„μˆ˜ ν•œ μˆ˜μ‹ ν•œλ‹€.

printf 'This\0is\0a\0lot\0\of\0\nulls.' |
    od -t x1 -w1 -v
    #output
0000000 54
0000001 68
0000002 69
0000003 73
0000004 00
0000005 69
0000006 73
    #and so on

λ‚˜λŠ” 당신이 μ–΄λŠ 것을 μΆ”μΈ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€ λ‚΄κΈ° \0null? 이 취급이 μš©μ΄ν•˜λ‹€λŠ”μ²˜λŸΌ μ„œλ©΄ μ–΄λŠ sed . sed쀑간 쀄 λ°”κΏˆμ„ printfμΉœμˆ™ν•œ ν˜•μ‹ μ½”λ“œλ‘œ λ°”κΎΈκ³  λ¬Έμžμ—΄μ„ 인쇄 ν•˜λŠ” null이 λ°œμƒν•  λ•ŒκΉŒμ§€ 각 μ€„μ˜ λ§ˆμ§€λ§‰ 두 문자λ₯Ό μ €μž₯ ν•©λ‹ˆλ‹€. κ²°κ³ΌλŠ” \0nullꡬ뢄 된 16 μ§„ λ°”μ΄νŠΈ λ¬Έμžμ—΄ λ°°μ—΄μž…λ‹ˆλ‹€. 보기:

printf %b\\n $(printf 'Fewer\0nulls\0here\0.' |
    _zedlmt | tee /dev/stderr)
    #output
\x46\x65\x77\x65\x72
\x6e\x75\x6c\x6c\x73
\x68\x65\x72\x65
\x2e
Fewer
nulls
here
.

μœ„μ˜ λ‚΄μš©μ„ νŒŒμ΄ν”„ν•˜μ—¬ teeλͺ…λ Ή susbstitution의 좜λ ₯κ³Ό printf의 처리 κ²°κ³Όλ₯Ό λͺ¨λ‘ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€ . μ„œλΈŒ μ‰˜μ΄ μ‹€μ œλ‘œ μΈμš©λ˜μ§€ μ•Šμ•˜μ§€λ§Œ printfμ—¬μ „νžˆ \0nullꡬ뢄 기호 둜만 λΆ„ν•  λ˜μ—ˆμŒμ„ μ•Œ 수 있기λ₯Ό λ°”λžλ‹ˆλ‹€ . 보기:

printf %b\\n $(printf \
        "Fe\n\"w\"er\0'nu\t'll\\'s\0h    ere\0." |
_zedlmt | tee /dev/stderr)
    #output
\x46\x65\x0a\x22\x77\x22\x65\x72
\x27\x6e\x75\x09\x27\x6c\x6c\x27\x73
\x68\x20\x20\x20\x20\x65\x72\x65
\x2e
Fe
"w"er
'nu     'll's
h    ere
.

ν•΄λ‹Ή ν™•μž₯에 λŒ€ν•œ μΈμš©λ¬Έλ„ μ—†μŠ΅λ‹ˆλ‹€-인용 μ—¬λΆ€λŠ” μ€‘μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ¬Έμžμ—΄μ„ 인쇄 ν•  \nλ•Œλ§ˆλ‹€ 생성 된 ν•˜λ‚˜μ˜ ewline을 μ œμ™Έν•˜κ³ λŠ” λ°”μ΄νŠΈ 값이 λΆ„λ¦¬λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έ sedμž…λ‹ˆλ‹€. 단어 λΆ„λ¦¬λŠ” μ μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 그리고 이것이 κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€.

_pidenv() { ps -p $1 >/dev/null 2>&1 &&
        [ -z "${1#"$psrc"}" ] && . /dev/fd/3 ||
        cat <&3 ; unset psrc pcat
} 3<<STATE
        $( [ -z "${1#${pcat=$psrc}}" ] &&
        pcat='$(printf %%b "%s")' || pcat="%b"
        xeq="$(printf '\\x%x' "'=")"
        for x in $( _zedlmt </proc/$1/environ ) ; do
        printf "%b=$pcat\n" "${x%%"$xeq"*}" "${x#*"$xeq"}"
        done)
#END
STATE

상기 κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” _zedlmtν•˜λ‚˜μ— ${pcat}발견 될 μˆ˜μžˆλŠ” μž„μ˜μ˜ ν”„λ‘œμ„ΈμŠ€ ν™˜κ²½ μ†Œμ‹± λ°”μ΄νŠΈ μ½”λ“œμ˜ μ€€λΉ„λœ 슀트림 /proc, λ˜λŠ” 직접 .dot ${psrc}μ „λ₯˜ μ…Έ λ™μΌν•˜κ±°λ‚˜ νŒŒλΌλ―Έν„°μ—†μ΄ 같은 단말에 λ™μΌμ˜ 처리 κ²°κ³Όλ₯Ό ν‘œμ‹œν•˜λ„λ‘ setλ˜λŠ” printenvμ˜μ§€. λͺ¨λ‘ 당신이 ν•„μš”ν•˜λ‹€ $pid– μ–΄λ–€ 읽을 μˆ˜μžˆλŠ” /proc/$pid/environνŒŒμΌμ„ ν•  κ²ƒμž…λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.

#output like printenv for any running process
_pidenv $pid 

#save human friendly env file
_pidenv $pid >/preparsed/env/file 

#save unparsed file for sourcing at any time
_pidenv ${pcat=$pid} >/sourcable/env.save 

#.dot source any pid's $env from any file stream    
_pidenv ${pcat=$pid} | sh -c '. /dev/stdin'

#feed any pid's env in on a heredoc filedescriptor
su -c '. /dev/fd/4' 4<<ENV
    $( _pidenv ${pcat=$pid} )
ENV

#.dot sources any $pid's $env in the current shell
_pidenv ${psrc=$pid} 

κ·ΈλŸ¬λ‚˜ 인간 μΉœν™”μ  이고 μ†Œμ‹± κ°€λŠ₯ν•œ κ²ƒμ˜ 차이점은 무엇 μž…λ‹ˆκΉŒ? κΈ€μŽ„, 차이점은이 닡변을 μ—¬κΈ°μ˜ λ‹€λ₯Έ λ‹΅λ³€κ³Ό λ‹€λ₯΄κ²Œ λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€. λ‹€λ₯Έ λͺ¨λ“  닡변은 μ–΄λ–€ 방식 μœΌλ‘œλ“  μ‰˜ μΈμš©μ— μ˜μ‘΄ν•˜μ—¬ λͺ¨λ“  μ—£μ§€ μΌ€μ΄μŠ€λ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€. 그것은 λ‹¨μˆœνžˆ 잘 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ―Ώμ–΄μ£Όμ„Έμš”-μ‹œν—˜ 을 λ³΄μ•˜μŠ΅λ‹ˆλ‹€. 보기:

_pidenv ${pcat=$$}
    #output
LC_COLLATE=$(printf %b "\x43")
GREP_COLOR=$(printf %b "\x33\x37\x3b\x34\x35")
GREP_OPTIONS=$(printf %b "\x2d\x2d\x63\x6f\x6c\x6f\x72\x3d\x61\x75\x74\x6f")
LESS_TERMCAP_mb=$(printf %b "\x1b\x5b\x30\x31\x3b\x33\x31\x6d")
LESS_TERMCAP_md=$(printf %b "\x1b\x5b\x30\x31\x3b\x33\x31\x6d")
LESS_TERMCAP_me=$(printf %b "\x1b\x5b\x30\x6d")
LESS_TERMCAP_se=$(printf %b "\x1b\x5b\x30\x6d")
LESS_TERMCAP_so=$(printf %b "\x1b\x5b\x30\x30\x3b\x34\x37\x3b\x33\x30\x6d")
LESS_TERMCAP_ue=$(printf %b "\x1b\x5b\x30\x6d")

NO νŽ‘ν‚€ 문자의 μ–‘ λ˜λŠ” 각 값에 λŒ€ν•œ λ°”μ΄νŠΈ λ‚΄μš©μ΄ μ†ŒμŠ€λ‘œ 맀우 μˆœκ°„κΉŒμ§€ ν‰κ°€λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—μ΄ 손상 될 수 μžˆμŠ΅λ‹ˆλ‹€ μΈμš©ν•˜μ§€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 그리고 μš°λ¦¬λŠ” 이미 적어도 ν•œ λ²ˆμ€ κ°’μœΌλ‘œ μž‘λ™ν•œλ‹€λŠ” 것을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€. 이것은 μ›λž˜ κ°’μ˜ λ°”μ΄νŠΈ λ‹¨μœ„ λ³΅μ‚¬λ³Έμ΄λ―€λ‘œ ꡬ문 뢄석 λ˜λŠ” 인용 λ³΄ν˜Έκ°€ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이 ν•¨μˆ˜λŠ” λ¨Όμ € $var이름을 ν‰κ°€ν•˜κ³  .dot파일 μ„€λͺ…μž 3에 곡급 된 here-doc을 μ†Œμ‹± ν•˜κΈ° 전에 검사가 μ™„λ£Œ 될 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦½λ‹ˆλ‹€ . λ°”λ³΄μž…λ‹ˆλ‹€. 그리고 POSIX νœ΄λŒ€μš©. 적어도 \ 0null μ²˜λ¦¬λŠ” POSIX 이식 κ°€λŠ₯ν•©λ‹ˆλ‹€. / process 파일 μ‹œμŠ€ν…œμ€ λΆ„λͺ…νžˆ Linux에 따라 λ‹€λ¦…λ‹ˆλ‹€. 이것이 두 κ°€μ§€ κΈ°λŠ₯μ΄μžˆλŠ” μ΄μœ μž…λ‹ˆλ‹€.


λ‹΅λ³€

λŒ€μ²΄ μ‚¬μš© 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μ—μ—†λŠ” ν™˜κ²½ λ³€μˆ˜λ₯Ό μ§€μš°μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 μžŠμ§€ λ§ˆμ‹­μ‹œμ˜€.


λ‹΅λ³€

ν”„λ‘œμ„ΈμŠ€μ— μœ νš¨ν•œ Bash / Sh / * sh λ³€μˆ˜κ°€ μ•„λ‹Œ ν™˜κ²½ λ³€μˆ˜κ°€μžˆμ„ 수 μžˆλ‹€λŠ” 점에 μ£Όλͺ©ν•  κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. POSIXλŠ” ν™˜κ²½ λ³€μˆ˜μ— 이름이 μΌμΉ˜ν•˜λ„λ‘ ꢌμž₯ν•˜μ§€λ§Œ μš”κ΅¬ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€ ^[a-zA-Z0-9_][a-zA-Z0-9_]*$.

Bashμ—μ„œ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€ ν™˜κ²½κ³Ό μ‰˜ ν˜Έν™˜ κ°€λŠ₯ν•œ λ³€μˆ˜ λͺ©λ‘μ„ μƒμ„±ν•˜λ €λ©΄ λ‹€μŒμ„ μˆ˜ν–‰ν•˜μ‹­μ‹œμ˜€.

function env_from_proc {
  local pid="$1" skipped=( )
  cat /proc/"$pid"/environ | while read -r -d "" record
  do
    if [[ $record =~ ^[a-zA-Z_][a-zA-Z0-9_]*= ]]
    then printf "export %q\n" "$record"
    else skipped+=( "$record" )
    fi
  done
  echo "Skipped non-shell-compatible vars: ${skipped[@]%%=*}" >&2
}

λ§ˆμ°¬κ°€μ§€λ‘œλ‘œλ“œν•˜λ €λ©΄ λ‹€μŒμ„ μˆ˜ν–‰ν•˜μ‹­μ‹œμ˜€.

function env_from_proc {
  local pid="$1" skipped=( )
  while read -r -d "" record
  do
    if [[ $record =~ ^[a-zA-Z_][a-zA-Z0-9_]*= ]]
    then export "$(printf %q "$record")"
    else skipped+=( "$record" )
    fi
  done < /proc/"$pid"/environ
  echo "Skipped non-shell-compatible vars: ${skipped[@]%%=*}" >&2
}

이 λ¬Έμ œλŠ” 가끔 λ°œμƒν•˜μ§€λ§Œ λ°œμƒν•˜λŠ” 경우 …


λ‹΅λ³€

POSIX 포터블이라고 μƒκ°ν•©λ‹ˆλ‹€.

. <<ENV /dev/stdin
    $(sed -n 'H;${x;s/\(^\|\x00\)\([^=]*.\)\([^\x00]*\)/\2\x27\3\x27\n/gp}' \
       /proc/$pid/environ)
ENV

κ·ΈλŸ¬λ‚˜ @GillesλŠ” 쒋은 지적 sedμ„ν•©λ‹ˆλ‹€. μ•„λ§ˆλ„ null을 처리 ν•  κ²ƒμž…λ‹ˆλ‹€. κ·Έλž˜μ„œ 거기에 (λ‚΄κ°€ 정말 μ΄λ²ˆμ—λŠ” κ·Έλ ‡κ²Œ 생각) 도 μ‹€μ œλ‘œ POSIX νœ΄λŒ€μš© 방법 :

s=$$SED$$
sed 's/'\''/'$s'/;1s/^./'\''&/' </proc/"$$"/environ |
tr '\0' "'" |
sed 's/'\''/&\n&/g' |
sed '1d;$d;s/^\('\''\)\([^=]*.\)/\2\1/;s/'$s'/'\\\''/g'

κ·Έλž˜λ„ GNU sedλ₯Ό κ°€μ§€κ³  μžˆλ‹€λ©΄ λ‹€μŒκ³Ό κ°™μ΄ν•˜λ©΄ λ©λ‹ˆλ‹€ :

sed -z 's/^[^=]*./&'\''/;s/$/'\''\n/' </proc/"$$"/environ

  #BOTH METHODS OUTPUT:

POSIX 이식성은 /dev/...μ§€μ •λ˜μ§€ μ•Šμ•˜μ§€λ§Œ λŒ€λΆ€λΆ„μ˜ Unicesμ—μ„œ ꡬ문이 λ™μΌν•˜κ²Œ μž‘λ™ ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이제 이것이 λ‹€λ₯Έ 질문 κ³Ό 관련이 μžˆλ‹€λ©΄ λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•˜κ³  싢을 κ²ƒμž…λ‹ˆλ‹€.

nsenter -m -u -i -n -p -t $PID /bin/bash 5<<ENV --rcfile=/dev/fd/5 
    $(sed -z 's/^[^=]*./&'\''/;s/$/'\''\n/' </proc/"$$"/environ)
ENV

here-doc은 μ„œλΈŒ μ‰˜μ—μ„œ μ²˜λ¦¬ν•˜κΈ° μ–΄λ €μš΄ 인용문으둜 μ‰˜μ΄ μ‘°μ΄λŠ” 것을 .dot막고 μ„œλΈŒ μ‰˜μ΄λ‚˜ μ‰˜μ΄ μ•„λ‹Œ μ†ŒμŠ€ νŒŒμΌμ— λŒ€ν•œ ν™•μ‹€ν•œ 경둜λ₯Ό μ œκ³΅ν•œλ‹€λŠ” μ μ—μ„œ 맀우 μœ μš©ν•©λ‹ˆλ‹€. λ³€ν•˜κΈ° μ‰¬μš΄. μ—¬κΈ°μ—μžˆλŠ” λ‹€λ₯Έ μ‚¬λžŒλ“€ <(process substitution)은 거의 같은 λ°©μ‹μœΌλ‘œ μž‘λ™ ν•˜λŠ” bashism을 μ‚¬μš©ν•©λ‹ˆλ‹€ -POSIX λŠ” here-docs |pipe만 μ§€μ • iohereν•˜λ―€λ‘œ μ‹€μ œλ‘œλŠ” νŒŒμΌμž…λ‹ˆλ‹€.ν•˜μ§€λ§Œ μ‹€μ œλ‘œλŠ” tempνŒŒμΌμž…λ‹ˆλ‹€. ( dash,반면, |pipeshere-docs μ—λŠ” 읡λͺ… 을 μ‚¬μš©ν•©λ‹ˆλ‹€ ) . κ·ΈλŸ¬λ‚˜ ν”„λ‘œμ„ΈμŠ€ λŒ€μ²΄μ— λŒ€ν•œ λΆˆν–‰ν•œ 점은 μ‰˜μ— μ˜μ‘΄ν•˜κΈ° λ•Œλ¬Έμ— μž‘μ—…ν•˜λŠ” 경우 특히 μ„±κ°€μ‹  문제 일 수 μžˆμŠ΅λ‹ˆλ‹€ init.

이것은 λ¬Όλ‘  μž‘λ™ |pipesν•˜μ§€λ§Œ |pipe'sμƒνƒœκ°€ ν•˜μœ„ μ…Έκ³Ό ν•¨κ»˜ 증발 ν•˜λ©΄ κ²°κ΅­ ν™˜κ²½μ„ λ‹€μ‹œ μžƒκ²Œλ©λ‹ˆλ‹€ . 그런 λ‹€μŒ λ‹€μ‹œ μž‘λ™ν•©λ‹ˆλ‹€.

sed '...;a\exec <>/dev/tty' /proc/$pid/environ | sh -i 

sedλ¬Έ μžμ²΄κ°€ λ§ˆμ§€λ§‰μ— 도달 ν•  λ•ŒκΉŒμ§€ 세계가 μΈμš©ν•˜κ³  μ‚½μž… 쀄 λ°”κΏˆμ„ μ²˜λ¦¬ν•˜λŠ” λŒ€μ‹  μˆ˜ν–‰ν•˜λŠ” μ‹œκ°„μ— λ©”λͺ¨λ¦¬μ— λͺ¨λ“  라인을 μœ μ§€ν•˜μ—¬ μž‘λ™ μ—¬κΈ°μ„œ 널 (null)에 고정이 적절. 정말 κ°„λ‹¨ν•©λ‹ˆλ‹€.

μ—μ„œ dash사진 당신은 λ‚΄κ°€ \ ν˜Όλž€μ„ ν”Όν•˜κ³  μΆ”κ°€ν•˜κΈ°λ‘œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€ GNUνŠΉμ •μ˜ -r에 μ˜΅μ…˜μ„ sed. κ·ΈλŸ¬λ‚˜ 그것은 νƒ€μ΄ν•‘ν•˜κΈ°κ°€ λœν•œ μ›μΈμž…λ‹ˆλ‹€. zsh이미지 μ—μ„œ λ³Ό 수 μžˆλ“―μ΄ μ–΄λŠ μͺ½μ΄λ“  μž‘λ™ν•©λ‹ˆλ‹€ .

μ—¬κΈ° μžˆμŠ΅λ‹ˆλ‹€ zsh:

그리고 여기에도 dash같은 일이 μžˆμŠ΅λ‹ˆλ‹€.

터미널 μ΄μŠ€μΌ€μ΄ν”„μ‘°μ°¨λ„ ν μ—†λŠ” μƒνƒœλ‘œ λ‚˜μ˜΅λ‹ˆλ‹€.