Por que $ COLUMNS não está listado por env ou conjunto? (no zsh)

1

Eu posso

$ echo $COLUMNS
95

e obter um resultado, mas se eu

env | grep COLUMNS

ou

set | grep COLUMNS

Eu não recebo nada.

(Update: Acabei de descobrir que o comportamento é diferente no bash. Estou usando o zsh.)

Secundariamente, como / onde posso obter uma listagem que inclua COLUMNS. (Não incluindo apenas ecoando diretamente.)

    
por iconoclast 10.12.2014 / 19:41

2 respostas

3

Se eu fosse adivinhar, suspeitaria de IFS . set lists IFS também. E para mim, IFS is (espaço, tabulação horizontal, nova linha e nul):

$ printf "%s" "$IFS" | od -a
0000000  sp  ht  nl nul
0000004

A presença do caractere NUL ( grep ) faz com que grep o trate como um arquivo binário, portanto, dependendo do seu grep , você poderá ver:

$ set | grep COLUMNS        
Binary file (standard input) matches

Você pode forçar %code% a tratar a entrada como texto:

-a, --text
    Process a binary file as if it were text; this is equivalent 
    to the --binary-files=text option.

E assim:

$ set | grep COLUMNS --text
COLUMNS=239
    
por 10.12.2014 / 19:57
4

set | grep COLUMNS deve exibir “Combinações de arquivo binário (entrada padrão)” (com GNU grep). muru identificou corretamente o culpado: em zsh, IFS contém o byte nulo, além do espaço de caracteres padrão, guia Newline.

Execute set | grep --text COLUMNS para fazer o grep ignorar sua inclinação para pular arquivos binários.

A execução de set não é uma forma confiável e portátil de listar os parâmetros atualmente definidos, porque sua saída é ambígua em muitos shells (não é possível distinguir uma nova linha que faz parte de um valor de variável da nova linha que separa variáveis) . A saída de set em zsh é citada para ser inequívoca, mas é difícil de analisar: grep ainda pode retornar falsos positivos. Para listar todos os parâmetros em zsh, enumere as chaves da matriz parameters :

print -rl ${(ko)parameters}
    
por 11.12.2014 / 00:43