1

GNU bash バージョン 3.2.57 でdeclare、配列変数を出力するための使用とnullglobオプションの間で競合が発生しています。

これらの 2 つは非常に無関係のように思えますが、nullglob有効になっている場合、これは意図的なものですか?

#!/bin/bash

test () {
  local FOO="xyz"
  local BAR=("one" "two" "three")
  declare -p FOO
  declare -a -p BAR
}

echo $(test)
shopt -s nullglob
echo $(test)
shopt -u nullglob
echo $(test)

出力:

declare -- FOO="xyz" declare -a BAR='([0]="one" [1]="two" [2]="three")'
declare -- FOO="xyz" declare -a
declare -- FOO="xyz" declare -a BAR='([0]="one" [1]="two" [2]="three")'

中央の行に注意してください。nullglobが設定されている場合、宣言BARは発行されません。

4

2 に答える 2

2

問題はありませんが、コマンドnullglobを引用していません。echo

それを引用すると、うまくいくはずです:

shopt -s nullglob
echo "$(test)"
declare -- FOO="xyz"
declare -a BAR='([0]="one" [1]="two" [2]="three")'

test出力に多くのグロブ文字があるため、シェルは引用符なしで関数の出力を展開しようとしています。

が設定されている場合nullglob、展開は失敗し、失敗したグロブ式については何も出力されません。

于 2016-10-07T21:28:10.657 に答える