ble version: 0.4.0-devel2+d84bcd8
Bash version: 5.0.18(1)-release
特記事項: 動作環境はGentoo on WSL2。
標題の通り,存在しないパスを入力した状態で補完鍵を押下した後に,
そのパスが元と全く異なるパスに置き換わってしまいます。
詳細なご説明ありがとうございます! こちらの手許ではやはり再現できていないですね…。どうも auto-complete で / が候補として表示されている時点で振る舞いが違っているようです。
ble.sh の組み込みの補完生成では遡って書き換わるような候補は生成しない様にしています。bash-completion のプログラム補完でも、こちらの手許では遡って書き換わることはないようです。手探りですが、取り敢えず以下の点について確認していただけると幸いです。
complete -p cd の結果はどうなっているか。cd 以外のコマンドでも同様に存在しないディレクトリが完全に置き換わるか。$ bash として入れ子で Bash を起動しても同様の現象が発生するか。bleopt complete_allow_reduction の結果はどうなっているか。complete -p cd: complete -o nospace -v -F _cd cdcd以外のコマンド: 置き換わりません(すいません,普通に調査不足でした)cdに対しては依然として発生するbleopt complete_allow_reduction: bleopt complete_allow_reduction=ありがとうございます。bash-completion っぽいですね。追加の確認:
complete -r とした後 (ble.sh 組み込みの補完生成を使った時) にも問題は発生するか/ 以下のディレクトリ一覧でしょうか?)complete -r後: 依然発生します。挙動も(恐らく)全く変わりません。complete -p cdの結果は,「補完指定がありません」となり,きちんと補完設定を削除できてはいる筈です。complete_auto_historyが有効で,/から始まるパスが履歴にある場合(cd /somewhere を実行していた場合)は,そのsomewhereという文字がカーソルの先に補完されます。厳密には再現できていませんがどうも -v の有無で振る舞いが変わるみたいです。こちらの bash-completion の設定だと complete -o nospace -F _cd cd のようになっているので気づきました。
complete -o nospace -F _cd cd (-v を除いた物)を実行した後でも問題は再現するか。complete -F : cd を実行した後に問題が再現するか。と思ったのですが complete -r 後でも発生するとの事で、関係ないかもです。
complete -o nospace -F _cd cd,complete -F : cd,いずれの実行後でも発生します。
以前は発生していなかった挙動(に思える; もしかしたらBashやOSの影響かも知れませんが……)ので,発生時期を特定したいのですが,ble.shのバージョンを遡る際は,普通にgitの履歴を遡るのと同じ方法を用いてよろしいでしょうか。
ble.shのバージョンを遡る際は,普通にgitの履歴を遡るのと同じ方法を用いてよろしいでしょうか。
はい、それで問題ありません。git checkout して試していただければ良いです。問題が発生するかどうかを自動判定できれば git bisect でも大丈夫の筈です。
すみません、ちょっと失念していたことがありました。cd の補完は特別に ble.sh の側で設定を用意しているのでした。
unset -f ble/cmdinfo/complete:cd を実行した後でも再現するか。echo "[$CDPATH]" の実行結果はどうなるか。unset -f ble/cmdinfo/complete:cd: 発生しません。この時,cdがbash-completion側で登録されていても(= complete -p cdの結果が空でない)発生しません。echo "[$CDPATH]": [/home/cmplstofb]ありがとうございます。犯人は ble/cmdinfo/complete:cd の実装っぽいです。ただ CDPATH が空でも再現するとのことで、そうすると ble/complete/source:dir が悪いという事になるのですが、この関数は他の補完とコードを共有している筈なので cd だけで問題が発生するというのも不思議です…
次の確認事項
$ function ble/cmdinfo/complete:cd { ble/complete/source:dir; } を実行した後にも再現するか。complete -r を実行した後に、cd 以外のコマンドでも問題が発生するようになっていることは?追加事項
たびたび情報を後出しして申し訳ないです。
function ble/cmdinfo/complete:cd { ble/complete/source:dir; }を実行: 依然として発生します。パスの先頭に "~"または"/" がある時とない時で補完時の挙動が違うかも知れません。
function ble/cmdinfo/complete:cd { ble/complete/source:dir; } を実行: 依然として発生します。
lib/core-complete.sh L1749-L1752 が怪しいかも…。
(WSLの場合に限定されますが)/mnt/c/などdrvfsでマウントされているディレクトリ以下では操作を受け付けなくなります(無限ループっぽいですが,精査できません)。
ファイルシステム絡みかもしれませんね。。ファイルシステムが応答しないと本当にシステムが応答しなくなるので…。"無限ループ" というのは実際に Bash の CPU 使用率などが大きくなっている感じでしょうか。或いは別のプロセスの CPU 使用率? もしくは CPU 使用率には現れない?
もしかすると WSL 特有の問題の可能性もあるかもしれませんね
function ble/cmdinfo/complete:cd { echo "[$COMPS]" >/dev/tty; } (訂正 COMPV → COMPS) として補完すると何と表示されますか (画面表示が乱れると思いますが [~] の中にどう表示されるか見ていただけると幸いです。function ble/cmdinfo/complete:cd { echo "[$COMPS]" >/dev/tty; }後:
下の遂行では,cd ~/.xまでは補完せず,xの直後にカーソルがある状態で一度だけ補完キーを押しました。
$ cd ~/.x[~/.x]
[]
[/]
[]
[~/.x]
[]
[/]
[]
"無限ループ" というのは
(知識が怪しいのですが)本当に無限ループしていたら,CPU使用率は100%に達しますよね。ところが,この,drvfs上で操作を受け付けなくなる挙動の場合,当該プロセス (bashという名前) のCPU使用率は25%付近で高止まりします。これが,実は無限ループではなく処理が極端に遅いだけなのか,OSかなにかが使用率を制限しているのかを判断できる知識がないので,「精査できない」と発言した訳です。申し訳ないです……。
うーん。なかなか分からないです。お手数をおかけしてすみません。
以下を bashrc の最後に追加して問題の補完を試み、その後での a.txt の内容を確認したいです。
blehook/eval-after-load complete debug1
debug1() {
ble/cmdinfo/complete:cd() {
local ret
ble/complete/source:file/.construct-pathname-pattern "$COMPV"; local pattern=$ret
ble/debug/print-variables COMPS COMPV pattern
ble/complete/util/eval-pathname-expansion "$pattern/"
ble/debug/print-variables ret
ble/complete/util/eval-pathname-expansion "$pattern"
ble/debug/print-variables ret
} >> a.txt 2>&1
}
CPU使用率は25%付近で高止まり
この % 値は core 数を考慮に入れたものかどうか分かりますか。つまり、1つの core を専有した時に 100% になるのか、全ての core を専有した時に 100% になるのか。$ nproc = 4 で後者の場合、25% になるのは理解できます。また、もし本当に無限ループだったとしても、ファイルシステムへのアクセスなどがあると I/O 割り込み待ち状態が無限ループの中に混ざって 100% より下がることも考えられますね…
いえ,むしろこちらが迷惑掛けているようなもんなので……。
a.txtの内容1:
/tmp/testdirの下に
00test-a.dir/ 00test-b.dir/ 00test-c.dir/ 00test-a.file 00test-b.file 00test-c.file
というファイル・ディレクトリを作成し,
その上で
$ cd ./.x<Tab> # !!! ピリオドを前置しています
と入力すると
$ cd ./a.txt
と置き換わりました。
COMPS='.' COMPV='.' pattern='.*'
ret=('../' './')
ret=('.' '..')
COMPS='./' COMPV='./' pattern='./*'
ret=('./00test-a.dir/' './00test-b.dir/' './00test-c.dir/')
ret=('./00test-a.dir' './00test-a.file' './00test-b.dir' './00test-b.file' './00test-c.dir' './00test-c.file' './a.txt')
COMPS='./.' COMPV='./.' pattern='./.*'
ret=('./../' '././')
ret=('./.' './..')
COMPS='./.x' COMPV='./.x' pattern='./.x*'
ret=()
ret=()
COMPS='' COMPV='' pattern='**'
ret=('00test-a.dir/' '00test-b.dir/' '00test-c.dir/')
ret=('00test-a.dir' '00test-a.file' '00test-b.dir' '00test-b.file' '00test-c.dir' '00test-c.file' 'a.txt')
COMPS='.' COMPV='.' pattern='.*'
ret=('../' './')
ret=('.' '..')
COMPS='' COMPV='' pattern='*'
ret=('00test-a.dir/' '00test-b.dir/' '00test-c.dir/')
ret=('00test-a.dir' '00test-a.file' '00test-b.dir' '00test-b.file' '00test-c.dir' '00test-c.file' 'a.txt')
COMPS='./.x' COMPV='./.x' pattern='./.x*'
ret=()
ret=()
COMPS='' COMPV='' pattern='**'
ret=('00test-a.dir/' '00test-b.dir/' '00test-c.dir/')
ret=('00test-a.dir' '00test-a.file' '00test-b.dir' '00test-b.file' '00test-c.dir' '00test-c.file' 'a.txt')
COMPS='.' COMPV='.' pattern='.*'
ret=('../' './')
ret=('.' '..')
COMPS='' COMPV='' pattern='*'
ret=('00test-a.dir/' '00test-b.dir/' '00test-c.dir/')
ret=('00test-a.dir' '00test-a.file' '00test-b.dir' '00test-b.file' '00test-c.dir' '00test-c.file' 'a.txt')
a.txtの内容2:
ホームディレクトリの下には
.cache/ .config/ .local/ .ssh/ .profile@
というファイル・ディレクトリがあります。
その上で
$ cd ~/.x<Tab> # !!! チルダを前置しています
と入力すると
$ cd ~/a.txt
と置き換わりました。
COMPS='~' COMPV='/home/cmplstofb' pattern='/home/cmplstofb*'
ret=('/home/cmplstofb/')
ret=('/home/cmplstofb')
COMPS='~/' COMPV='/home/cmplstofb/' pattern='/home/cmplstofb/*'
ret=()
ret=('/home/cmplstofb/a.txt')
COMPS='~/.' COMPV='/home/cmplstofb/.' pattern='/home/cmplstofb/.*'
ret=('/home/cmplstofb/../' '/home/cmplstofb/./' '/home/cmplstofb/.cache/' '/home/cmplstofb/.config/' '/home/cmplstofb/.local/' '/home/cmplstofb/.ssh/')
ret=('/home/cmplstofb/.' '/home/cmplstofb/..' '/home/cmplstofb/.cache' '/home/cmplstofb/.config' '/home/cmplstofb/.local' '/home/cmplstofb/.profile' '/home/cmplstofb/.ssh')
COMPS='~/.x' COMPV='/home/cmplstofb/.x' pattern='/home/cmplstofb/.x*'
ret=()
ret=()
COMPS='' COMPV='' pattern='**'
ret=()
ret=('a.txt')
COMPS='/' COMPV='/' pattern='/'
ret=('//')
ret=('/')
COMPS='' COMPV='' pattern='*'
ret=()
ret=('a.txt')
COMPS='~/.x' COMPV='/home/cmplstofb/.x' pattern='/home/cmplstofb/.x*'
ret=()
ret=()
COMPS='' COMPV='' pattern='**'
ret=()
ret=('a.txt')
COMPS='/' COMPV='/' pattern='/'
ret=('//')
ret=('/')
COMPS='' COMPV='' pattern='*'
ret=()
ret=('a.txt')
ありがとうございます! 今日は移動なので返事がちょっと遅くなります。頂いた結果を見るとどうもこの部分の処理が犯人のようですので、頂いた結果を後で詳しく見てみることにします。
確認です。7c6b67b の変更が入っているようですが、ble.sh 更新しましたか。昨日試した時の振る舞いは d84bcd8 で起こっていた振る舞いか 7c6b67b に更新した後の振る舞いか確認を取りたいです。
あと、応答がなくなる問題に関しては、もしかしてこれかもというのを 2f40422 の序で修正したので push します。
あ、すみません…a.txt というファイル名にするべきではなかったですね…。.x が a.txt に置き換えられるのは曖昧補完による期待される動作です (a「.」t「x」t と一致している)。なので、先の ~/.x が / に変わってしまうのとは本質的に異なる振る舞いですね。
すみませんが、.x ではなくて .q などそのディレクトリのファイル名に含まれない文字で試していただくか、或いは a.txt の方を別のファイル名に変えて再度試して頂けませんか。お手数をおかけしてすみません。
応答がなくなる問題に関しては,現時点での最新版 2f40422 で解消されました! ありがとうございます。
存在しないパス名を補完した際に "/" から始まるパス名に置き換わるという現象は相変らず生じております。
以下は,
$ cd ~/.x<Tab>
とした時の記録です。なお,ファイル名は "/tmp/67.log" にしました。
また,記録を取る為にdebug1()函数を書き換えたところ,この場合には問題の挙動は起こりませんでした。
COMPS='~' COMPV='/home/cmplstofb' pattern='/home/cmplstofb*'
ret=('/home/cmplstofb/')
ret=('/home/cmplstofb')
COMPS='~/' COMPV='/home/cmplstofb/' pattern='/home/cmplstofb/*'
ret=()
ret=()
COMPS='' COMPV='' pattern='**'
ret=()
ret=()
COMPS='/' COMPV='/' pattern='/'
ret=('//')
ret=('/')
COMPS='~/.' COMPV='/home/cmplstofb/.' pattern='/home/cmplstofb/.*'
ret=('/home/cmplstofb/../' '/home/cmplstofb/./' '/home/cmplstofb/.cache/' '/home/cmplstofb/.config/' '/home/cmplstofb/.local/' '/home/cmplstofb/.ssh/')
ret=('/home/cmplstofb/.' '/home/cmplstofb/..' '/home/cmplstofb/.cache' '/home/cmplstofb/.config' '/home/cmplstofb/.local' '/home/cmplstofb/.profile' '/home/cmplstofb/.ssh')
COMPS='~/.x' COMPV='/home/cmplstofb/.x' pattern='/home/cmplstofb/.x*'
ret=()
ret=()
COMPS='' COMPV='' pattern='**'
ret=()
ret=()
COMPS='/' COMPV='/' pattern='/'
ret=('//')
ret=('/')
COMPS='' COMPV='' pattern='*'
ret=()
ret=()
COMPS='~/.x' COMPV='/home/cmplstofb/.x' pattern='/home/cmplstofb/.x*'
ret=()
ret=()
COMPS='' COMPV='' pattern='**'
ret=()
ret=()
COMPS='/' COMPV='/' pattern='/'
ret=('//')
ret=('/')
COMPS='' COMPV='' pattern='*'
ret=()
ret=()
COMPS='~/.x' COMPV='/home/cmplstofb/.x' pattern='/home/cmplstofb/.x*'
ret=()
ret=()
COMPS='' COMPV='' pattern='**'
ret=()
ret=()
COMPS='/' COMPV='/' pattern='/'
ret=('//')
ret=('/')
COMPS='' COMPV='' pattern='*'
ret=()
ret=()
何か分かった気がします。これは 7c6b67b の変更が原因ですね。 7c6b67b 以降で再現できましたので後でこちらで修正します。
報告にある d84bcd8 では再現しない筈で実際手許では再現しないのですが、再度確認して頂けますか。
(もし d84bcd8 でも発生しているとすれば未だ他に問題があるという事になりますね)
問題の挙動は 7c6b67b では発生し, d84bcd8 では発生しませんでした。(git checkout xxx && make install → 新規Bashセッション立ち上げ,で確認)
(あれ,しかしそうすると始めの報告とは矛盾しますね……)
5c17a31 (取り敢えず再現している分は) 直しました。ble/cmdinfo/complete:* の仕様自体に孕む問題だったので、新しくどういう仕様に改めるのが良いかなと思って時間が空いてしまいました。考えがまとまったので実装しました。
(あれ,しかしそうすると始めの報告とは矛盾しますね……)
手違いで別のセッションの BLE_VERSION をコピーしてしまったのかもしれません (僕の場合ありがちです…) し、或いは類似の別な問題が隠れているのかもしれません。取り敢えず、最新版で確認していただいて問題がなくなっていれば良いかなと思います。もし隠れている問題が後で判明したらその時にまた Issue を立てていただければ幸いです
確認いたしました。ありがとうございます。
ありがとうございました!