Como imprimir variáveis e valores do shell para poder copiá-los / colá-los?

1

No Bash 4.2.25, a saída set e env não é ignorada, portanto, o shell escapa e todos os caracteres não imprimíveis não são passíveis de cópia. Tomemos por exemplo esta sessão de shell:

$ export foo=$'a\nbar=\baz'
$ env | grep -A 1 foo
foo=a
baraz

Idem para, por exemplo, cores - Elas são impressas literalmente e podem atrapalhar o terminal. Como você imprime todas as variáveis com seus valores de forma que a saída possa ser copiada e colada para fornecer o mesmo ambiente? *

* Obviamente, com as advertências padrão sobre variáveis readonly, variáveis especiais como $_ e similares.

    
por l0b0 15.04.2013 / 17:30

2 respostas

3

Você poderia fazer:

printvars() (
  eval 'declare() { printf declare; printf " %q" "$@"; echo; }'"
        $(declare -p)"
)

printvars

Isso pode ser facilmente estendido para omitir variáveis somente de leitura, como:

printvars() (
  eval 'declare() {
          [[ $1 = *r* ]] && return
          printf declare; printf " %q" "$@"; echo
        }'"
        $(declare -p)"
)
    
por 15.04.2013 / 23:12
2
escaped_env() {
    cat /proc/self/environ | while IFS== read -r -d '' name value
    do
        printf '%s=%q\n' "$name" "$value"
    done
}

Exemplo de sessão:

$ export foo=$'a\nbar=\baz'
$ escaped_env | grep foo
foo=$'a\nbar=\baz'

Isso funciona, mas apenas para export ed variáveis, e set não parece ter uma opção de separador-␀.

FYI, o sistema de arquivos / proc não é um recurso POSIX.1-2008 e parece apenas < a href="https://en.wikipedia.org/wiki/Procfs#Linux"> Linux implementa /proc/self/environ . Se o seu sistema operacional não tiver esse arquivo, talvez você queira usar env --null antes do pipe.

    
por 15.04.2013 / 17:30