その後、shopt -s nullglob
タブの完成が完全に機能しないことがわかりました。なぜですか?extglob
明らかに良性です、nullglobはまたどのような影響を与えますか?
観察場所:
- Ubuntu 14.04(リリース
4.3.11(1)-release
) - Arch Linux(bash
4.3.42(1)-release
)
答え1
シェルの動作はかなり異なりますextglob
。nullglob
これは、どんなものとも一致しない可能性があるワイルドカード文字を含む単語によって、その単語が残っているのではなく消えることを意味します。
ほとんどの場合、ディレクトリに引用符のないパターンと一致するファイルが含まれている場合、区切り文字を使用するコードnullglob
もパターンなしで中断されます。モードによっては、これらのファイルは存在する可能性が多少高くなります(そしてスクリプトが存在するファイル名を制御する場合(例えば、埋め込みは一時ディレクトリに切り替えるため)不可能かもしれません)。
Bashのタブ補完はデフォルトでnullglobの影響を受けませんが、プログラマブルコンプリートを実装するいくつかのbashコードは強力ではないため、プログラマブルコンプリートが有効になっている場合は影響を受けます。
開かれたパラメータが完了すると、何が起こるかを見ると、出力があるものとないものが変わり始めることがわかりますls
。set -x
nullglob
+ [[ 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 の場合。