![xrandr | grep " connected " は複数行を返しますが、IFS=$'\n' の読み取りでは分割できません](https://rvso.com/image/1457840/xrandr%20%7C%20grep%20%22%20connected%20%22%20%E3%81%AF%E8%A4%87%E6%95%B0%E8%A1%8C%E3%82%92%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81IFS%3D%24'%5Cn'%20%E3%81%AE%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8A%E3%81%A7%E3%81%AF%E5%88%86%E5%89%B2%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93.png)
次のようなものがあります:
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
システム変数であり、上書きされると多くの望ましくない問題が発生する可能性があります。