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


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 inded:

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

Eu ainda quero saber por que não se dividiu em linhas de quebra.


1


origem




Respostas:


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

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

o -d opçã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 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")'

Usando % funciona porque read continua lendo passado %. Por padrão, ele só pára para caracteres de nova linha.

De outros

Considera-se as melhores práticas usar nomes de 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.


1



Obrigado, incluindo a nomeação sobre nomes de variáveis, não sabia sobre isso como shell é um pouco novo para mim. :) - RomuloPBenedetti