xrandr | grep “connected” me da mais de uma linha mas IFS = $ '\ n' read não pode quebrar

1

Eu tenho algo assim:

declare -a DISPLAYS
AUXILIAR="$(xrandr | grep " connected ")"
IFS=$'\n' read -ra DISPLAYS <<< "$AUXILIAR"

Por que não está detectando quebras de linha se

echo "$AUXILIAR" 

Imprimir mais de uma linha?

UPDATE

Este trabalho foi escrito:

AUXILIAR="$(xrandr | grep " connected " | tr '\n' '%')"
IFS='%' read -ra DISPLAYS <<< $(echo $AUXILIAR)

Eu ainda quero saber por que ele não foi dividido em linhas de quebra.

    
por RomuloPBenedetti 19.07.2015 / 09:10

1 resposta

1

Por padrão, read somente lerá uma linha por vez . Por exemplo, aqui fornecemos três linhas de entrada e, como você pode ver, read apenas lê a primeira linha:

$ IFS=$'\n' read -ra displays <<< $'a\nb\nc\n'; declare -p displays
declare -a displays='([0]="a")'

A opção -d pode ser usada para alterar esse comportamento. Por exemplo:

$ IFS=$'\n' read -d '' -ra displays <<< $'a\nb\nc\n'; declare -p displays
declare -a displays='([0]="a" [1]="b" [2]="c")

Aqui, -d '' foi usado. Isso informa read para ler até encontrar um caractere NUL. Como nunca pode haver um caractere NUL em uma string bash, isso faz com que ele leia toda a entrada que fornecemos com a string here.

Usando%

$ IFS=% read -ra displays <<< 'a%b%c'; declare -p displays
declare -a displays='([0]="a" [1]="b" [2]="c")'

Usar % funciona porque read continua lendo além de % . Por padrão, ele só pára para caracteres de nova linha.

Outro

Considera-se práticas recomendadas usar nomes com letras maiúsculas ou minúsculas para suas variáveis. O sistema usa nomes de letras maiúsculas e você não quer sobrescrever acidentalmente um deles. Por exemplo, DISPLAY é uma variável do sistema e muitos problemas desagradáveis podem ocorrer se forem sobrescritos.

    
por 19.07.2015 / 09:55