xrandr | grep "connected" 给我多行,但 IFS=$'\n' 读取无法打破它

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 字符,因此这会导致它读取我们用此处字符串提供的所有输入。

使用 %

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

使用%有效,因为read会继续读取 之后的%内容。默认情况下,它只会在遇到换行符时停止。

其他

为变量使用小写或混合大小写名称被认为是最佳做法。系统使用大写名称,您不想意外覆盖其中一个。例如,DISPLAY是一个系统变量,如果被覆盖,可能会发生许多令人不快的问题。

相关内容