Acho que isso é portátil POSIX:
. <<ENV /dev/stdin
$(sed -n 'H;${x;s/\(^\|\x00\)\([^=]*.\)\([^\x00]*\)/\x27\x27\n/gp}' \
/proc/$pid/environ)
ENV
Mas @Gilles faz um bom argumento - sed
provavelmente irá lidar com valores nulos, mas talvez não. Então existe esse método portátil POSIX, também:
s=$$SED$$
sed 's/'\''/'$s'/;1s/^./'\''&/' </proc/"$$"/environ |
tr 'sed -z 's/^[^=]*./&'\''/;s/$/'\''\n/' </proc/"$$"/environ
#BOTH METHODS OUTPUT:
' "'" |
sed 's/'\''/&\n&/g' |
sed '1d;$d;s/^\('\''\)\([^=]*.\)//;s/'$s'/'\\''/g'
Ainda assim, se você tem o GNU sed
, só precisa fazer:
nsenter -m -u -i -n -p -t $PID /bin/bash 5<<ENV --rcfile=/dev/fd/5
$(sed -z 's/^[^=]*./&'\''/;s/$/'\''\n/' </proc/"$$"/environ)
ENV
Bem,POSIXportável,excetopelo/dev/...
,quenãoéespecificado,masvocêpodeesperarqueasintaxesecomportenamaioriadosUnices.
Agora,seissotiveralgoavercom sua outra pergunta , você pode gostar de usá-lo assim:
sed '...;a\exec <>/dev/tty' /proc/$pid/environ | sh -i
O aqui-doc é extremamente útil na medida em que evita que o shell trepe com qualquer uma das citações que trabalhamos tão duro para manipular no subshell e também nos fornece um caminho confiável para um arquivo <%> / em> em vez de, novamente, uma subshell ou uma variável shell. Outros aqui usam o .dot
bashism que funciona da mesma maneira - só que é definitivamente um <(process substitution)
anônimo, enquanto o POSIX só especifica um |pipe
para o here-docs e então pode ser qualquer tipo de arquivo, embora, na prática , geralmente é um arquivo iohere
. ( temp
, por outro lado, usa anônimo dash,
para o here-docs) . A coisa infeliz sobre a substituição de processos é que ela também é dependente do shell - o que pode ser um problema especialmente irritante se você estiver trabalhando com |pipes
.
Isso também funciona com init
, mas você perde o ambiente novamente no final, quando o estado |pipes
evapora com sua subcamada. Então, novamente, isso funciona:
. <<ENV /dev/stdin
$(sed -n 'H;${x;s/\(^\|\x00\)\([^=]*.\)\([^\x00]*\)/\x27\x27\n/gp}' \
/proc/$pid/environ)
ENV
A própria instrução |pipe's
funciona mantendo todas as linhas na memória até que ela atinja a última, momento em que realiza uma substituição global manipulando aspas e inserindo novas linhas onde apropriado ancorando nos nulos. Bastante simples na verdade.
Na imagem sed
, você verá que eu optei por evitar a \ mess e adicionei a opção dash
specific GNU
a -r
. Mas isso é apenas porque era menos para digitar. Funciona de qualquer forma, como você pode ver na imagem sed
.
Aqui está o zsh
:
Eaquiestázsh
fazendoamesmacoisa:
Mesmo escapes de terminal passam por incólumes: