Xrandr | grep " connected " дает мне более одной строки, но чтение IFS=$'\n' не может разбить его

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

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.

С помощью %

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

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

Другой

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

Другие вопросы по тегам