nullglobがタブの完成に影響するのはなぜですか?

nullglobがタブの完成に影響するのはなぜですか?

その後、shopt -s nullglobタブの完成が完全に機能しないことがわかりました。なぜですか?extglob明らかに良性です、nullglobはまたどのような影響を与えますか?

観察場所:

  • Ubuntu 14.04(リリース4.3.11(1)-release
  • Arch Linux(bash 4.3.42(1)-release

答え1

シェルの動作はかなり異なりますextglobnullglobこれは、どんなものとも一致しない可能性があるワイルドカード文字を含む単語によって、その単語が残っているのではなく消えることを意味します。

ほとんどの場合、ディレクトリに引用符のないパターンと一致するファイルが含まれている場合、区切り文字を使用するコードnullglobもパターンなしで中断されます。モードによっては、これらのファイルは存在する可能性が多少高くなります(そしてスクリプトが存在するファイル名を制御する場合(例えば、埋め込みは一時ディレクトリに切り替えるため)不可能かもしれません)。

Bashのタブ補完はデフォルトでnullglobの影響を受けませんが、プログラマブルコンプリートを実装するいくつかのbashコードは強力ではないため、プログラマブルコンプリートが有効になっている場合は影響を受けます。

開かれたパラメータが完了すると、何が起こるかを見ると、出力があるものとないものが変わり始めることがわかりますlsset -xnullglob

+ [[ 0 -gt 0 ]]
+ ref='words[0]'
+ eval 'words[0]=${!ref}${COMP_WORDS[i]}'
++ words[0]=ls
+ line=' '

(作業)コントラスト

+ [[ 0 -gt 0 ]]
+ ref='words[0]'
+ eval
+ line=' '

ヌルグローブと。そのeval行に見えますか?これは、パラメータがグローバルパターンのように見えることを示します。そのコードは__reassemble_comp_words_by_ref関数にあります。

                # Append word separator to current or new word
                ref="$2[$j]"
                eval $2[$j]=\${!ref}\${COMP_WORDS[i]}

[はワイルドカードで、$2[$j]=\${!ref}\${COMP_WORDS[i]}ワイルドカードパターンもワイルドカードパターンで、その場合はnullglob何も一致しないため削除されます。nullglob現在のディレクトリに名前付きファイルが含まれている場合でも、バランスは維持されます。words0=${!ref}${COMP_WORDSi}奇妙ですが、これが起こる可能性があります。

回避策は、欠落している二重引用符を追加することです。

                eval "$2[$j]=\${!ref}\${COMP_WORDS[i]}"

スクリプトの他の部分にも同様の修正が必要な場合がありますが、もう調査していません。

これはbash_completion(bash自体ではない)のバグです。報告される2012年にそしてそれを固定するルートマップバージョン 3.0 の場合。

関連情報