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, read
será somente leiturauma linha de cada vez. Por exemplo, aqui fornecemostrêslinhas de entrada e, como você pode ver, read
lê apenas a primeira linha:
$ IFS=$'\n' read -ra displays <<< $'a\nb\nc\n'; declare -p displays
declare -a displays='([0]="a")'
A -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 diz 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 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 read
continua 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.