As entradas são separadas pelo caractere nulo, consulte man 5 proc :
/proc/[pid]/environ
This file contains the environment for the process. The entries
are separated by null bytes ('$ xargs -0 -L1 -a /proc/self/environ
LC_CTYPE=UTF-8
USER=muru
LOGNAME=muru
HOME=/home/muru
MAIL=/var/mail/muru
SHELL=/bin/zsh
...
'), and there may be a null byte
at the end.
Portanto, uma maneira simples é aplicar xargs -0 -L1 :
while IFS= read -d '' -r line
do
printf "%q\n" "$line"
done < /proc/.../environ
-
-0- ler linhas delimitadas por nulo, -
-L1- leia uma linha por execução de comando -
-a fileleu linhas defile - e se nenhum comando for especificado,
xargssimplesmente imprime a linha.
Vários comandos GNU têm opções para trabalhar com dados delimitados por nulo: -z para sed , sort , uniq , grep etc e para nomes de arquivos, -print0 com find e -Z com grep.
Como alternativa, você pode usar o bash antigo:
sed -z 's/$/\n/' /proc/.../environ
-d '' informa read para leitura até um byte nulo, IFS= e -r previnem a divisão de campos e a contrabarra, para que os dados sejam lidos como são, %q citará caracteres especiais na saída.
Como você usou sed , você poderia ter feito:
/proc/[pid]/environ
This file contains the environment for the process. The entries
are separated by null bytes ('$ xargs -0 -L1 -a /proc/self/environ
LC_CTYPE=UTF-8
USER=muru
LOGNAME=muru
HOME=/home/muru
MAIL=/var/mail/muru
SHELL=/bin/zsh
...
'), and there may be a null byte
at the end.
que apenas cria uma nova linha no final de cada linha delimitada por nulo.