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 file
leu linhas defile
- e se nenhum comando for especificado,
xargs
simplesmente 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.