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
является системной переменной, и при ее перезаписи может возникнуть много неприятных проблем.