xrandr | grep " verbunden " gibt mir mehr als eine Zeile, aber IFS=$'\n' lesen kann es nicht unterbrechen

xrandr | grep " verbunden " gibt mir mehr als eine Zeile, aber IFS=$'\n' lesen kann es nicht unterbrechen

Ich habe so etwas:

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

Warum werden Zeilenumbrüche nicht erkannt, wenn

echo "$AUXILIAR" 

Mehr als eine Zeile drucken?

AKTUALISIEREN

Diese Arbeit beinhaltet:

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

Ich möchte immer noch wissen, warum es nicht in Bruchlinien aufgeteilt wurde.

Antwort1

Standardmäßig readwird nur gelesenjeweils eine Zeile. Hier bieten wir beispielsweisedreiEingabezeilen und readliest, wie Sie sehen, nur die erste Zeile:

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

Mit dieser -dOption können Sie dieses Verhalten ändern. Beispiel:

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

Hier -d ''wurde verwendet. Dies weist an, readzu lesen, bis ein NUL-Zeichen gefunden wird. Da in einer Bash-Zeichenfolge niemals ein NUL-Zeichen vorkommen kann, bewirkt dies, dass alle Eingaben gelesen werden, die wir mit der Here-Zeichenfolge bereitstellen.

% verwenden

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

Die Verwendung %funktioniert, weil readdas Lesen über hinaus fortgesetzt wird %. Standardmäßig wird nur bei Zeilenumbruchzeichen angehalten.

Andere

Es gilt als bewährte Vorgehensweise, für Ihre Variablen Kleinbuchstaben oder gemischte Groß- und Kleinschreibung zu verwenden. Das System verwendet Namen in Großbuchstaben und Sie möchten nicht versehentlich einen davon überschreiben. Beispielsweise handelt es DISPLAYsich um eine Systemvariable und das Überschreiben könnte viele unangenehme Probleme verursachen.

verwandte Informationen