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