xrand | grep "conectado" dame más de una línea pero IFS=$'\n' read no puede dividirla

xrand | grep "conectado" dame más de una línea pero IFS=$'\n' read no puede dividirla

Tengo algo como esto:

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

¿Por qué no detecta saltos de línea si?

echo "$AUXILIAR" 

¿Imprimir más de una línea?

ACTUALIZAR

Este trabajo concluyó:

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

Todavía quiero saber por qué no se dividió en líneas de rotura.

Respuesta1

De forma predeterminada, readsolo será de solo lectura.una línea a la vez. Por ejemplo, aquí proporcionamostreslíneas de entrada y, como puede ver, readsolo lee la primera línea:

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

La -dopción se puede utilizar para cambiar este comportamiento. Por ejemplo:

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

Aquí -d ''se utilizó. Esto le indica readque lea hasta que encuentre un carácter NUL. Dado que nunca puede haber un carácter NUL en una cadena bash, esto hace que lea toda la entrada que proporcionamos con la cadena aquí.

Usando %

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

Usar %funciona porque readcontinúa leyendo pasado %. De forma predeterminada, solo se detiene con caracteres de nueva línea.

Otro

Se considera una buena práctica utilizar nombres en minúsculas o en mayúsculas mixtas para las variables. El sistema utiliza nombres en mayúsculas y no querrás sobrescribir accidentalmente uno de ellos. Por ejemplo, DISPLAYes una variable del sistema y podrían ocurrir muchos problemas desagradables si se sobrescribiera.

información relacionada