κ²μ¬ /proc/1/environ
νλ©΄ null λ°μ΄νΈλ‘ κ΅¬λΆ λ νλ‘μΈμ€ 1
νκ²½ λ³μ λ¬Έμμ΄μ λ³Ό μ μμ΅λλ€ . μ΄ λ³μλ₯Ό νμ¬ νκ²½μΌλ‘ κ°μ Έμ€κ³ μΆμ΅λλ€. μ΄ μμ
μ μννλ μ¬μ΄ λ°©λ²μ΄ μμ΅λκΉ?
proc
λ§€λ΄μΌ νμ΄μ§ λμκ² λΌμΈλ³λ‘ κ°κ°μ νκ²½ λ³μλ₯Ό μΆλ ₯ ν λ° λμμ΄λλ 미리보기λ₯Ό μ 곡ν©λλ€ (cat /proc/1/environ; echo) | tr '\000' '\n'
. μ΄κ²μ λ΄μ©μ΄ μ¬λ°λ₯Έμ§ νμΈνλ λ° λμμ΄λμ§λ§ μ€μ λ‘ν΄μΌ ν μΌμ μ΄λ¬ν λ³μλ₯Ό νμ¬ bash μΈμ
μΌλ‘ κ°μ Έ μ€λ κ²μ
λλ€.
μ΄λ»κ²ν©λκΉ?
λ΅λ³
λ€μμ κ° νκ²½ λ³μλ₯Ό export
λͺ
λ Ήλ¬Έ μΌλ‘ λ³ν νκ³ μλ‘ μ½κΈ° μν΄ μ¬λ°λ₯΄κ² μΈμ© ν λ€μ μΈμ©ν©λλ€ ( LS_COLORS
μ : μΈλ―Έμ½λ‘ μ΄ ν¬ν¨λμ΄ μκΈ° λλ¬Έμ).
[ μνκΉκ²λ printf
inμ /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)
(μ΄ μ
Έμμ λΉ κ΅¬λΆ κΈ°νΈκ° μ λ¬λλ©΄ read
null λ°μ΄νΈκ° κ΅¬λΆ κΈ°νΈκ°λ©λλ€. 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,
λ°λ©΄, |pipes
here-docs μλ μ΅λͺ
μ μ¬μ©ν©λλ€ ) . κ·Έλ¬λ νλ‘μΈμ€ λ체μ λν λΆνν μ μ μμ μμ‘΄νκΈ° λλ¬Έμ μμ
νλ κ²½μ° νΉν μ±κ°μ λ¬Έμ μΌ μ μμ΅λλ€ init
.
μ΄κ²μ λ¬Όλ‘ μλ |pipes
νμ§λ§ |pipe's
μνκ° νμ μ
Έκ³Ό ν¨κ» μ¦λ° νλ©΄ κ²°κ΅ νκ²½μ λ€μ μκ²λ©λλ€ . κ·Έλ° λ€μ λ€μ μλν©λλ€.
sed '...;a\exec <>/dev/tty' /proc/$pid/environ | sh -i
sed
λ¬Έ μμ²΄κ° λ§μ§λ§μ λλ¬ ν λκΉμ§ μΈκ³κ° μΈμ©νκ³ μ½μ
μ€ λ°κΏμ μ²λ¦¬νλ λμ μννλ μκ°μ λ©λͺ¨λ¦¬μ λͺ¨λ λΌμΈμ μ μ§νμ¬ μλ μ¬κΈ°μ λ (null)μ κ³ μ μ΄ μ μ . μ λ§ κ°λ¨ν©λλ€.
μμ dash
μ¬μ§ λΉμ μ λ΄κ° \ νΌλμ νΌνκ³ μΆκ°νκΈ°λ‘ λ³Ό μ μμ΅λλ€ GNU
νΉμ μ -r
μ μ΅μ
μ sed
. κ·Έλ¬λ κ·Έκ²μ νμ΄ννκΈ°κ° λν μμΈμ
λλ€. zsh
μ΄λ―Έμ§ μμ λ³Ό μ μλ―μ΄ μ΄λ μͺ½μ΄λ μλν©λλ€ .
μ¬κΈ° μμ΅λλ€ zsh
:
κ·Έλ¦¬κ³ μ¬κΈ°μλ dash
κ°μ μΌμ΄ μμ΅λλ€.
ν°λ―Έλ μ΄μ€μΌμ΄νμ‘°μ°¨λ ν μλ μνλ‘ λμ΅λλ€.