xrandr | grep " connected " выдает мне больше одной строки, но IFS=$'\n' read не может ее разорвать

xrandr | grep " connected " выдает мне больше одной строки, но IFS=$'\n' read не может ее разорвать

У меня что-то вроде этого:

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

Почему он не обнаруживает разрывы строк, если

echo "$AUXILIAR" 

Печатать более одной строки?

ОБНОВЛЯТЬ

Эта работа предназначалась:

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

Мне все еще интересно, почему он не разделился на линии разрыва.

решение1

По умолчанию readбудет доступно только чтение.по одной строке за раз. Например, здесь мы предоставляемтристрок ввода и, как вы видите, readчитает только первую строку:

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

Эту -dопцию можно использовать для изменения этого поведения. Например:

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

Здесь, -d ''был использован. Это говорит readо чтении, пока не будет найден символ NUL. Поскольку в строке bash никогда не может быть символа NUL, это заставляет его читать все входные данные, которые мы предоставляем с помощью строки here-string.

С использованием %

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

Использование %работает, потому что readпродолжает чтение после %. По умолчанию останавливается только на символах новой строки.

Другой

Считается лучшими практиками использовать для переменных имена в нижнем или смешанном регистре. Система использует имена в верхнем регистре, и вы не хотите случайно перезаписать одно из них. Например, DISPLAYявляется системной переменной, и может возникнуть множество неприятных проблем, если она будет перезаписана.

Связанный контент