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 ''사용되었습니다. 이는 readNUL 문자를 찾을 때까지 읽도록 지시합니다. 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시스템 변수이며 덮어쓰면 많은 불쾌한 문제가 발생할 수 있습니다.

관련 정보