xrandr | grep "connected" me dá mais de uma linha, mas IFS=$'\n' read não pode quebrá-la

xrandr | grep "connected" me dá mais de uma linha, mas IFS=$'\n' read não pode quebrá-la

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?

ATUALIZAR

Este trabalho indicou:

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

Ainda quero saber por que não foi dividido em linhas de quebra.

Responder1

Por padrão, readserá somente leiturauma linha de cada vez. Por exemplo, aqui fornecemostrêslinhas de entrada e, como você pode ver, readlê apenas a primeira linha:

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

A -dopção 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 diz readpara ler até encontrar um caractere NUL. Como nunca pode haver um caractere NUL em uma string bash, isso faz com que ele leia todas as entradas 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")'

Usando %funciona porque readcontinua lendo o passado %. Por padrão, ele para apenas para caracteres de nova linha.

Outro

É considerado uma prática recomendada usar nomes com letras minúsculas ou mistas para suas variáveis. O sistema usa nomes em letras maiúsculas e você não deseja substituir acidentalmente um deles. Por exemplo, DISPLAYé uma variável do sistema e muitos problemas desagradáveis ​​poderiam ocorrer se ela fosse substituída.

informação relacionada