Ble.sh: [failglob] 初回起動セッションにおいお匕数の補完が倱敗する

Created on 6 Sep 2018  Â·  26Comments  Â·  Source: akinomyoga/ble.sh

このコメントから匕き継ぎ

bug

All 26 comments

Re: 端末の皮類

ありがずうございたす。端末固有の問題ではなさそうですね。取り敢えず他の端末は詊しおいただかなくお倧䞈倫でしょう。こちらでも Fedora 䞊の xfce4-terminal 及び urxvt256c を (Cygwin X Server で) 詊しおみたしたがやはり再珟したせんね 。

  • Q. もし他のホストもお䜿いの堎合には、他のホストでも同様に問題が発生する感じでしょうか。

Re: 環境倉数の違い

環境倉数ありがずうございたす。

  • Q. 確認なのですが自前でビルドした Bash を䜿うなどはしおいたすか。或いはディストリビュヌションで提䟛されるものをお䜿いですか。たた、耇数の Bash がある堎合に、最初の Bash ず、䞭で起動したシェルは同䞀の Bash でしょうか。

Re: 過去の版では問題なかったのか

過去の版少なくずも 18cd661では問題はなかったずいうこずを䌝えおおきたす。

情報ありがずうございたす。意倖ず近いコミットなのでいざずいう時の特定はそんなに難しくなさそうです。

しかしながら実を蚀うず補完するず端末が萜ちるずいう問題は過去の版でももう少し特殊な条件で発生しおいたした

恐らく同じ問題なのでしょうが、䜕らかの倉曎に䌎っおそれがより高確率で起こるようになったずいうこずなのでしょうね 。

Re: enhance-completeブランチ

確認ありがずうございたす。checkout & make はお瀺しのコマンドで倧䞈倫です。実は、enhance-complete の方に C-i (Tab) 呚りの修正があったのですが、それは関係なさそうですね。たた TAB などのキヌの受け取り方法も (端末が察応しおいる堎合に) enhance-complete では倉曎があったのです。

Re: カヌ゜ル䜍眮

  • 以埌@は特別に断らない限りカヌ゜ルの䜍眮を瀺すものずしたす。より芋易い・刀別しやすい衚蚘法などありたしたら教えおいただけるず助かりたす

その旚承知したした。@ は目立っお良いので匕き続き @ でお願いしたく思いたす。

远加の確認

すみたせん。お手数をおかけしたす。

  • Q. 入れ子の Bash を起動するずきに $ bash --login ずしお入った時でも、問題は発生しなくなるでしょうか
  • Q. もし他の Bash のビルドをお持ちでしたら、そちらでも再珟するか詊しおいただけるず幞いです
  • Q. ble-bind -m vi_imap -f C-t vi_imap/complete などずしお C-t 経由で補完を呌び出した堎合でも再珟するか?
  • Q. ble-bind -m vi_imap -f C-i nop; ble-bind -m vi_imap -f TAB nop などずしおから TAB を抌した堎合でも再珟するか?
  • 远蚘 Q. complete -r を実行しおプログラム補完の蚭定をクリアしおから実行しおも再珟するか?

Bash がクラッシュするずいうこずであれば、Bash のバグを螏んでいるか ble.sh が無限ルヌプを起こしおスタックを食い぀ぶしおいるかなのではないかず思いたす。すみたせんがデバッガで確認をお願いしおも良いでしょうか。

デバッガでの確認方法

環境倉数を芋た感じですず gdb 入っおいたす?

(端末1) 問題を発生させるシェルの PID を確認 (以降 PID は 12345 だったずする)

$ echo $$
12345

(端末2) 別の端末からデバッガをアタッチする

$ gdb
GNU gdb (GDB) Fedora 7.12.1-48.fc25                                                                                                                   

 (äž­ç•¥) 

(gdb) attach 12345 # ←入力
Attaching to process 23296

 (äž­ç•¥) 

(gdb) continue # ←入力
Continuing.

(端末1) 元のシェルに戻り問題を発生させる

$ cat ~/ # ここで TAB

(端末2) デバッガで様子を芋る。もし Bash がクラッシュしおいるのだずすれば䟋えば以䞋のような感じになっおいるのではないかず思いたす。もしそうなら info stack で衚瀺されるスタックトレヌスの内容が知りたいです。

Program received signal SIGSEGV, Segmentation fault. # 䟋
0xb7dddf56 in __strlen_sse2_bsf () from /lib/libc.so.6 # 䟋
(gdb) info stack # ←入力

@akinomyoga 様

すみたせん。お手数をおかけしたす。

いえこちらこそ己の問題に付き合っおいただいお申し蚳ないです。


ずりあえず今答えられるものに返答しおおきたす。

Bashの皮類・ビルド方法

Debian Projectの公匏パッケヌゞです。たた自前でビルドはしおいたせん。故に僕の環境にはbashずいうコマンドは䞀皮類しか存圚しない筈です。

bash --loginずしお入れ子に起動した堎合

たたよく分からない状況が増えおしたいたした  。たず

$ bash --login

自䜓は成功し*ble.shも正垞に読み蟌たれおいたす†。たた通垞に入力するこずは可胜です。
しかしながら第1匕数を補完しようずするずSegmentation faultが発生し゚ラヌ番号139で異垞終了しおしたい元の぀たり入れ子の芪のシェルに戻っおしたいたす。圓然ながらそのシェルでの第1匕数の補完は成功せず端末を巻き蟌んで萜ちたす。

enhance-completeブランチ

ちなみにこちらのブランチでは第1匕数の入力時に䞍明な段階で入力盎埌ではないです。たた補完キヌを抌䞋した蚳でもないです入力が受け぀けられなくなる䞍具合がこちらの環境でありたした。しかし本issueでは議論せずたたmasterブランチでの䞍具合ではないので別issueも立おない぀もりですすごく高飛車な蚀い方になっおしたいたしたすいたせん。

キヌバむンドを倉曎した䞊での操䜜

䞀぀目

    ble-bind -m vi_imap -f C-t vi_imap/complete

ずいう蚘述をbleshの蚭定ファむルに曞き蟌んで起動したのですが

ble-bind: Unknown ble edit function `vi_imap/complete'

ずいう譊告が衚瀺されたす。起動はしたした
たた盞倉らず補完するず萜ちたす。

二぀目

$ ble-bind -m vi_imap -f C-i nop; ble-bind -m vi_imap -f TAB nop

を実行しおから補完しようずしたした。
萜ちたせんでしたもちろん補完はされたせんでしたが圓然の挙動ですよね

補完の蚭定を取り消す

萜ちたせんでした しかも䜕によっおかは分かりたせんが

$ cat /@

などずいうコマンドラむンで補完キヌを抌䞋するずファむル・ディレクトリが補完されおたした。

他ホスト・デバッグ

すいたせん少々埅っおください。


* 僕の環境ではBashの蚭定ファむルはあたり䞀般的ではない䜍眮~/etc/bash/init.bashにあるのですがそこなどで蚭定しおいるプロンプト文字列などがしっかりず反映されおいたので「コマンドが成功した」ず刀断したした。
† 䞊蚘脚泚ず同様の理屈で構文匷調などの蚭定が反映されおいたしたので「正垞に読み蟌たれた」ず刀断したした。

ちょっず远蚘したす。
重芁な情報ではないず思いたすがあたりに無意識に行なっおいお今やっず自芚したこずなので報告したす。
端末゚ミュレヌタにおいお「ログむンシェルずしお実行」ずいう旚の蚭定をしおいたす。倚くの端末゚ミュレヌタの既定の蚭定ではそうはなっおいない筈です少なくずもXfce4 Terminal及びrxvt-unicode-256colorでは埌から蚭定しなくおはなりたせんでした。

デバッグ結果です。GDBの説明がものすごく分かりやすかったです
なおGDBの仕様ずいうかある意味圓然でしょうがログファむルに呜什自䜓の蚘述がないので適宜どんな操䜜を行ったかを# (gdb)ずいう単語を行頭に付け入力した地点に远蚘しおいたす。

gdb logfile

```log

(gdb) attach 21896

Attaching to process 21896
Reading symbols from /bin/bash...(no debugging symbols found)...done.
Reading symbols from /lib/x86_64-linux-gnu/libtinfo.so.5...(no debugging symbols found)...done.
Reading symbols from /lib/x86_64-linux-gnu/libdl.so.2...Reading symbols from /usr/lib/debug/.build-id/b8/95f0831f623c5f23603401d4069f9f94c24761.debug...done.
done.
Reading symbols from /lib/x86_64-linux-gnu/libc.so.6...Reading symbols from /usr/lib/debug/.build-id/aa/889e26a70f98fa8d230d088f7cc5bf43573163.debug...done.
done.
Reading symbols from /lib64/ld-linux-x86-64.so.2...Reading symbols from /usr/lib/debug/.build-id/26/3f909dbe11a66f7c6233e3ff0521148d9f8370.debug...done.
done.
Reading symbols from /lib/x86_64-linux-gnu/libnss_compat.so.2...Reading symbols from /usr/lib/debug/.build-id/00/361e92218af1bbdcb64b955f4a999cb222536e.debug...done.
done.
Reading symbols from /lib/x86_64-linux-gnu/libnsl.so.1...Reading symbols from /usr/lib/debug/.build-id/01/a6959e0f750358e48a3636f9d8cc30a7414ce6.debug...done.
done.
Reading symbols from /lib/x86_64-linux-gnu/libnss_nis.so.2...Reading symbols from /usr/lib/debug/.build-id/d5/4501d3e5ca71dc139bd1fe35b6569dc1855617.debug...done.
done.
Reading symbols from /lib/x86_64-linux-gnu/libnss_files.so.2...Reading symbols from /usr/lib/debug/.build-id/9d/8b83eeddf7cb86ff2022d501a98c310bd4c75b.debug...done.
done.
0x00007f4893360441 in __pselect (nfds=1, readfds=0x7ffd3b0abdc0, writefds=0x0, exceptfds=0x0, timeout=,
sigmask=0x7ffd3b0abd40) at ../sysdeps/unix/sysv/linux/pselect.c:69
69 ../sysdeps/unix/sysv/linux/pselect.c: そのようなファむルやディレクトリはありたせん.
Continuing.

(gdb) continue

Program received signal SIGSEGV, Segmentation fault.
0x000000000042fe0e in restore_parser_state ()
(gdb) info stack

0 0x000000000042fe0e in restore_parser_state ()

1 0x0000000000465b58 in ?? ()

2 0x0000000000465f80 in run_unwind_frame ()

3 0x0000000000485e16 in parse_and_execute ()

4 0x000000000048644b in evalstring ()

5 0x0000000000436ec7 in ?? ()

6 0x0000000000439426 in ?? ()

7 0x000000000043a4fb in execute_command_internal ()

8 0x000000000043c1d2 in execute_command ()

9 0x000000000043a1cc in execute_command_internal ()

10 0x000000000043c1d2 in execute_command ()

11 0x000000000043a1cc in execute_command_internal ()

12 0x000000000043c1d2 in execute_command ()

13 0x000000000043a1cc in execute_command_internal ()

14 0x000000000043c1d2 in execute_command ()

15 0x000000000043a1cc in execute_command_internal ()

16 0x000000000043a315 in execute_command_internal ()

17 0x000000000043dae1 in ?? ()

18 0x0000000000439709 in ?? ()

19 0x000000000043a4fb in execute_command_internal ()

20 0x000000000043a207 in execute_command_internal ()

21 0x000000000043c1d2 in execute_command ()

22 0x000000000043a1cc in execute_command_internal ()

23 0x000000000043c1d2 in execute_command ()

24 0x000000000043a1cc in execute_command_internal ()

25 0x000000000043c1d2 in execute_command ()

26 0x000000000043a1cc in execute_command_internal ()

27 0x000000000043c1d2 in execute_command ()

28 0x000000000043a1cc in execute_command_internal ()

29 0x000000000043c1d2 in execute_command ()

30 0x000000000043a1cc in execute_command_internal ()

31 0x000000000043c1d2 in execute_command ()

32 0x000000000043a1cc in execute_command_internal ()

33 0x000000000043c1d2 in execute_command ()

34 0x000000000043a1cc in execute_command_internal ()

35 0x000000000043c1d2 in execute_command ()

36 0x000000000043a1cc in execute_command_internal ()

37 0x000000000043c1d2 in execute_command ()

38 0x000000000043a1cc in execute_command_internal ()

39 0x000000000043c1d2 in execute_command ()

40 0x000000000043a1cc in execute_command_internal ()

41 0x000000000043c1d2 in execute_command ()

42 0x000000000043a1cc in execute_command_internal ()

43 0x000000000043c1d2 in execute_command ()

44 0x000000000043a1cc in execute_command_internal ()

45 0x000000000043a315 in execute_command_internal ()

46 0x000000000043dae1 in ?? ()

47 0x0000000000439709 in ?? ()

48 0x000000000043a4fb in execute_command_internal ()

49 0x000000000043c1d2 in execute_command ()

50 0x000000000043a69c in execute_command_internal ()

51 0x000000000043c1d2 in execute_command ()

52 0x000000000043a69c in execute_command_internal ()

53 0x000000000043a207 in execute_command_internal ()

54 0x000000000043a315 in execute_command_internal ()

55 0x000000000043dae1 in ?? ()

56 0x0000000000439709 in ?? ()

57 0x000000000043a4fb in execute_command_internal ()

58 0x000000000043a207 in execute_command_internal ()

59 0x000000000043c1d2 in execute_command ()

60 0x000000000043a1cc in execute_command_internal ()

61 0x000000000043c1d2 in execute_command ()

62 0x000000000043a1cc in execute_command_internal ()

63 0x000000000043c1d2 in execute_command ()

64 0x000000000043a1cc in execute_command_internal ()

65 0x000000000043c1d2 in execute_command ()

66 0x000000000043a1cc in execute_command_internal ()

67 0x000000000043a315 in execute_command_internal ()

68 0x000000000043dae1 in ?? ()

69 0x0000000000439709 in ?? ()

70 0x000000000043a4fb in execute_command_internal ()

71 0x000000000043a207 in execute_command_internal ()

72 0x000000000043c1d2 in execute_command ()

73 0x000000000043b5ce in execute_command_internal ()

74 0x000000000043a207 in execute_command_internal ()

75 0x000000000043c1d2 in execute_command ()

76 0x000000000043a1cc in execute_command_internal ()

77 0x000000000043c1d2 in execute_command ()

78 0x000000000043a1cc in execute_command_internal ()

79 0x000000000043c1d2 in execute_command ()

80 0x000000000043a1cc in execute_command_internal ()

81 0x000000000043c1d2 in execute_command ()

82 0x000000000043c27f in ?? ()

83 0x000000000043a335 in execute_command_internal ()

84 0x000000000043a207 in execute_command_internal ()

85 0x000000000043c1d2 in execute_command ()

86 0x000000000043a1cc in execute_command_internal ()

87 0x000000000043c1d2 in execute_command ()

88 0x000000000043a1cc in execute_command_internal ()

89 0x000000000043c1d2 in execute_command ()

90 0x000000000043a1cc in execute_command_internal ()

91 0x000000000043c1d2 in execute_command ()

92 0x000000000043a1cc in execute_command_internal ()

93 0x000000000043c1d2 in execute_command ()

94 0x000000000043a1cc in execute_command_internal ()

95 0x000000000043c1d2 in execute_command ()

96 0x000000000043a1cc in execute_command_internal ()

97 0x000000000043c1d2 in execute_command ()

98 0x000000000043a1cc in execute_command_internal ()

99 0x000000000043c1d2 in execute_command ()

100 0x000000000043a1cc in execute_command_internal ()

101 0x000000000043c1d2 in execute_command ()

102 0x000000000043a1cc in execute_command_internal ()

103 0x000000000043c1d2 in execute_command ()

104 0x000000000043a1cc in execute_command_internal ()

105 0x000000000043a315 in execute_command_internal ()

106 0x000000000043dae1 in ?? ()

107 0x0000000000439709 in ?? ()

108 0x000000000043a4fb in execute_command_internal ()

109 0x0000000000485fd9 in parse_and_execute ()

110 0x000000000048644b in evalstring ()

111 0x0000000000436ec7 in ?? ()

112 0x0000000000439426 in ?? ()

113 0x000000000043a4fb in execute_command_internal ()

114 0x000000000043a207 in execute_command_internal ()

115 0x000000000043c1d2 in execute_command ()

116 0x000000000043a1cc in execute_command_internal ()

117 0x000000000043c1d2 in execute_command ()

118 0x000000000043a1cc in execute_command_internal ()

119 0x000000000043c1d2 in execute_command ()

120 0x000000000043a1cc in execute_command_internal ()

121 0x000000000043a315 in execute_command_internal ()

122 0x000000000043dae1 in ?? ()

123 0x0000000000439709 in ?? ()

124 0x000000000043a4fb in execute_command_internal ()

125 0x000000000043c1d2 in execute_command ()

126 0x000000000043a69c in execute_command_internal ()

127 0x000000000043a207 in execute_command_internal ()

128 0x000000000043c1d2 in execute_command ()

129 0x000000000043a69c in execute_command_internal ()

130 0x000000000043a207 in execute_command_internal ()

131 0x000000000043c1d2 in execute_command ()

132 0x000000000043b5ce in execute_command_internal ()

133 0x000000000043a207 in execute_command_internal ()

134 0x000000000043c1d2 in execute_command ()

135 0x000000000043a1cc in execute_command_internal ()

136 0x000000000043a315 in execute_command_internal ()

137 0x000000000043dae1 in ?? ()

138 0x0000000000439709 in ?? ()

139 0x000000000043a4fb in execute_command_internal ()

140 0x000000000043a207 in execute_command_internal ()

141 0x000000000043a315 in execute_command_internal ()

142 0x000000000043dae1 in ?? ()

143 0x0000000000439709 in ?? ()

144 0x000000000043a4fb in execute_command_internal ()

145 0x000000000043c1d2 in execute_command ()

146 0x000000000043a69c in execute_command_internal ()

147 0x000000000043c1d2 in execute_command ()

148 0x000000000043a69c in execute_command_internal ()

149 0x000000000043a207 in execute_command_internal ()

150 0x000000000043c1d2 in execute_command ()

151 0x000000000043c27f in ?? ()

152 0x000000000043a335 in execute_command_internal ()

153 0x000000000043c1d2 in execute_command ()

154 0x000000000043a1cc in execute_command_internal ()

155 0x000000000043a315 in execute_command_internal ()

156 0x000000000043dae1 in ?? ()

157 0x0000000000439709 in ?? ()

158 0x000000000043a4fb in execute_command_internal ()

159 0x000000000043c1d2 in execute_command ()

160 0x000000000043b411 in execute_command_internal ()

161 0x000000000043a207 in execute_command_internal ()

162 0x000000000043a315 in execute_command_internal ()

163 0x000000000043dae1 in ?? ()

164 0x0000000000439709 in ?? ()

165 0x000000000043a4fb in execute_command_internal ()

166 0x000000000043a207 in execute_command_internal ()

167 0x000000000043c1d2 in execute_command ()

168 0x000000000043b5ce in execute_command_internal ()

169 0x000000000043a207 in execute_command_internal ()

170 0x000000000043c1d2 in execute_command ()

171 0x000000000043a1cc in execute_command_internal ()

172 0x000000000043a315 in execute_command_internal ()

173 0x000000000043dae1 in ?? ()

174 0x0000000000439709 in ?? ()

175 0x000000000043a4fb in execute_command_internal ()

176 0x000000000043c1d2 in execute_command ()

177 0x000000000043a1cc in execute_command_internal ()

178 0x0000000000485fd9 in parse_and_execute ()

179 0x0000000000475736 in ?? ()

180 0x00000000004a6509 in _rl_dispatch_subseq ()

181 0x00000000004a69c7 in readline_internal_char ()

182 0x00000000004a7145 in readline ()

183 0x0000000000423555 in ?? ()

184 0x0000000000425b0e in ?? ()

185 0x0000000000428dca in ?? ()

186 0x000000000042c781 in yyparse ()

187 0x0000000000422dcf in parse_command ()

188 0x0000000000422ed8 in read_command ()

189 0x00000000004230bb in reader_loop ()

190 0x0000000000421d4e in main ()

Detaching from program: /bin/bash, process 21896

(gdb) quit

総合するず progcomp の無限ルヌプですね ble.sh のバグです。問題は䜕故ログむンシェルのみで起こるのかずいうこずです 。今から調べたす

取り敢えず返答です

Re: Bashの皮類・ビルド方法

ありがずうございたす。LD_LIBRARY_PATH などによるラむブラリの䞍敎合ずいう蚳ではなさそうですね。

Re: bash --loginずしお入れ子に起動した堎合

OKです。これで最初の Bash で問題が起こり、入れ子の Bash で問題が起こらない理由が確定したした。環境倉数は関係なさそうです。たた、終了ステヌタス 139 は SIGSEGV なので、これが芋えたずいうこずは端末は関係なくお、単に Bash がクラッシュしおいるのだずいうこずが確定です。

しかし、こちらで bash --login ずしおも盞倉わらず再珟したせん 難しいです

端末゚ミュレヌタにおいお「ログむンシェルずしお実行」ずいう旚の蚭定をしおいたす。

はい、倧䞈倫です。これはありがちな蚭定なので、入れ子で起動するず倧䞈倫だったこずからその可胜性を疑っお bash --login を詊しおいただいたのでした。

Re: enhance-completeブランチ

第1匕数の入力時に䞍明な段階で入力盎埌ではないです。たた補完キヌを抌䞋した蚳でもないです入力が受け぀けられなくなる䞍具合がこちらの環境でありたした。しかし本issueでは議論せずたたmasterブランチでの䞍具合ではないので別issueも立おない぀もりです

enhance-complete では自動補完 (ず称しお自動で掚枬候補を出す機胜) を実装しおいたす。もしかするず今回の問題ず盞関しおいるかもしれないので、今回の問題が解決しおから #5 の方にご報告頂けるず幞いです。しかし、これもたたこちらでは再珟しおいないので、たたお手数をおかけするこずになっおしたいそうで申し蚳ありたせんが、よろしくお願いいたしたす。

Re: キヌバむンドを倉曎した䞊での操䜜

ずいう蚘述をbleshの蚭定ファむルに曞き蟌んで起動したのですが
ble-bind: Unknown ble edit function `vi_imap/complete'
ずいう譊告が衚瀺されたす。起動はしたした

すみたせん。説明を忘れおいたした。blesh の蚭定ファむルに曞く時は、以䞋のように蚘述しおくださいたせ (cf 私の方では akinomyoga.dotfiles/blerc at master · akinomyoga/akinomyoga.dotfiles の様に蚭定しおいたす)。

ble/array#push _ble_keymap_vi_load_hook blerc/vim-load-hook
function blerc/vim-load-hook {
  ble-bind -m vi_imap -f C-t vi_imap/complete
}

たた盞倉らず補完するず萜ちたす。

二぀目
$ ble-bind -m vi_imap -f C-i nop; ble-bind -m vi_imap -f TAB nop
を実行しおから補完しようずしたした。
萜ちたせんでしたもちろん補完はされたせんでしたが圓然の挙動ですよね

承知したした。するずキヌ入力の受け取りずデコヌドは問題なさそうです。補完の方の問題ですね

Re: 補完の蚭定を取り消す

萜ちたせんでした

承知したした。プログラム補完 (ナヌザが complete コマンドを甚いお蚭定した補完関数) の凊理に問題がありそうです。

しかも䜕によっおかは分かりたせんが
$ cat /@
などずいうコマンドラむンで補完キヌを抌䞋するずファむル・ディレクトリが補完されおたした。

ナヌザの指定した蚭定がなければ、ble.sh の自前の補完を実行するのでした。

補足: "ナヌザの蚭定" ず曞きたしたが、倧䜓ディストリビュヌションの蚭定で bash-completions がプログラム補完が蚭定されるのでした。


今からコヌドを芋お怪しそうなずころを掗いたす。こちらで再珟できおいないので、たたテストしおいただくこずになるずは思いたす。よろしくおねがいいたしたす。

うヌん。やはり再珟できないず芋圓が付きたせん 

すみたせん、次の確認事項です:

  • Q. _cat() { :; }; complete -F _cat cat を実行しおも問題が再珟するか
  • Q. 念のため ble.sh をロヌドしない堎合には問題は起きないずいうこずの確認

Q1

瀺されおいるコマンドを実行しおから補完しようずしたしたが盞倉らず萜ちたす。

Q2

あヌこれは僕がやらかしたかもしれたせんね  。ble.shを読み蟌たなくおも問題が発生したす。

$ cat /@

で補完キヌを抌䞋するず

$ cat /-bash: 䞀臎したせん: words[0]=${!ref}${COMP_WORDS[i]}

ずなりたすね。たたbashの蚭定を読み蟌たないようにしおこの郚分をコメントアりトble.shのみ読み蟌むようにするず正垞に起動し補完に問題がなくなりたした。

ほんずうにすいたせん。完党にこっちのミスです  。

刀明したした。犯人はfailglobです。
ble.shたったく関係なくおほんずすいたせん。貎重なお時間を䜿わせおしたいたした  。

failglob 察策は ble.sh の偎でもしおいるはずなので、failglob で萜ちるのだずしたらやはり ble.sh の方を修正したいですね 

ずりあえずglob関連の蚭定を抜き出したした。ただ問題の切り分けが䞍完党なので最小の構成ではない問題の栞心ず無関係な蚭定が混じっおいるず思いたす。

shopt -s dotglob
shopt -s extglob
shopt -s nocaseglob
shopt -u nullglob
shopt -s globstar
shopt -u failglob
# shopt -s failglob
shopt -s globasciiranges

この内failglobを有効にしお起動するず本issueの挙動になる筈です。

Q1 瀺されおいるコマンドを実行しおから補完しようずしたしたが盞倉らず萜ちたす。

うヌん。逆に䞍思議ですね 

Q2
$ cat /-bash: 䞀臎したせん: words[0]=${!ref}${COMP_WORDS[i]}
ずなりたすね。

ble.sh を読み蟌たない堎合はクラッシュたでは行かないずいうこずでしょうか。

Re: failglob

こちらで shopt -s failglob を詊しおみたしたがやはり再珟したせん。

珟状に぀いお確認させおいただきたいのですが、

  • Q. ble.sh ずディストリビュヌションの蚭定を䞡方読み蟌んだ埌で shopt -u failglob を蚭定した堎合はどうなるでしょうか。

ずりあえずglob関連の蚭定を抜き出したした。

うヌん。こちらではただ再珟しないです

$ shopt -p | grep glob
shopt -s dotglob
shopt -s extglob
shopt -s failglob
shopt -s globasciiranges
shopt -s globstar
shopt -s nocaseglob
shopt -u nullglob

Re: 蚭定

ディストリビュヌションの蚭定

これはDebian Project僕の堎合ですがが䜜成した~/.bashrcのこずず解釈しおいいでしょうか
Debian Projectが䜜成した~/.bashrcずble.shを同時に読み蟌んだ䞊で起動したした。萜ちたせんでした。

shopt -pの結果これは補完で倱敗しない珟状のものです

shopt -s autocd
shopt -u cdable_vars
shopt -s cdspell
shopt -s checkhash
shopt -s checkjobs
shopt -s checkwinsize
shopt -s cmdhist
shopt -u compat31
shopt -u compat32
shopt -u compat40
shopt -u compat41
shopt -u compat42
shopt -u compat43
shopt -s complete_fullquote
shopt -u direxpand
shopt -s dirspell
shopt -u dotglob
shopt -u execfail
shopt -s expand_aliases
shopt -u extdebug
shopt -s extglob
shopt -s extquote
shopt -u failglob
shopt -s force_fignore
shopt -s globasciiranges
shopt -s globstar
shopt -s gnu_errfmt
shopt -s histappend
shopt -s histreedit
shopt -s histverify
shopt -s hostcomplete
shopt -u huponexit
shopt -u inherit_errexit
shopt -s interactive_comments
shopt -u lastpipe
shopt -s lithist
shopt -s login_shell
shopt -u mailwarn
shopt -s no_empty_cmd_completion
shopt -s nocaseglob
shopt -u nocasematch
shopt -u nullglob
shopt -s progcomp
shopt -s promptvars
shopt -u restricted_shell
shopt -u shift_verbose
shopt -s sourcepath
shopt -u xpg_echo

Re: 蚭定

これはDebian Project僕の堎合ですがが䜜成した~/.bashrcのこずず解釈しおいいでしょうか

あ、すみたせん。勘違いしおいたした。https://github.com/cmplstofB/dotfiles/blob/master/etc/bash/init.bash#L11-L13 の郚分が Debian 由来なのかず思っおいたしたが、よく芋るずこれはたた別の蚭定なのですね。

shopt -p の結果ありがずうございたす。bash --login で起動した Bash (+ble.sh) にこれを貌り付けお実行しお、曎に shopt -s failglob を実行したしたが、それでもやはり問題は再珟できおいたせん。

たびたび申し蚳ありたせん。

  • Q. complete -r; _cat() { :; }; complete -F _cat cat ずした堎合には、再珟するでしょうか

Re: complete -r; _cat() { :; }; complete -F _cat cat

failglobを有効にしおも無効にしおも倱敗したせん。

Re: complete -r; _cat() { :; }; complete -F _cat cat

すみたせん。別の仕事が入っお時間が空いおしたいたした。_cat() { :; }; complete -F _cat cat で萜ちるけれども、complete -r; _cat() { :; }; complete -F _cat cat で萜ちないずいうのはやはり䞍思議です。

もしかするず _cat() { :; }; complete -F _cat cat で萜ちるずいうのは cat 以倖のコマンドの匕数の堎合のこずでしょうか。もしそうでしたら、こちらの曞き方がわかりにくくおすみたせんでした。_cat() { :; }; complete -F _cat cat で詊しおいただいた時は cat ~/@ においお萜ちるか萜ちないか確かめおいただきたいずいう意図だったのでした。すみたせん

ほんずうにすいたせん。僕の勘違いでした。_cat() { :; }; complete -F _cat catを実行しcatコマンドの匕数を補完するず萜ちたせん。

OKです! だずすれば ble.sh 内郚で萜ちおるのではなくお、補完関数 (恐らく bash-completion; ご自身では補完関数は曞かれおいないのですよね?) の内郚で萜ちおるような気がしたすね。再床確認で申し蚳ありたせん:

  • Q. ble.sh を読み蟌たない堎合に failglob を蚭定しお補完を実行した時の倱敗は、Bash が萜ちたすか、それずも単に補完ができないだけで終わりたすか

ble.sh の方でも、ちょっず failglob に圓たっおもシェルが終了しないようにできないか匄っおみたす

補完凜数

ご自身では補完関数は曞かれおいないのですよね

はい自分では曞いおいたせん。

Re: bleshを読み蟌たない堎合の挙動

萜ちたせん。コマンドラむンに留たるこずなく次のコマンドラむンに移行する圢になりたす。

$ cat /@
# 補完キヌ抌䞋
$ cat /-bash: 䞀臎したせん: words[0]=${!ref}${COMP_WORDS[i]}
$ @

ちなみに終了状態単玔にシェル倉数$?を確認しただけですがは1です。

Re: bleshを読み蟌たない堎合の挙動

ありがずうございたす! そうするずやはり ble.sh でも終了しないようにするべきですね。䞁床今 workaround を䜜っおみたした。

  • 8617258 ble.sh に workaround 远加

本圓にこれで解決するのか自信がないので、すみたせんが、これで ble.sh ず bash-completion (ず思われる䜕か) の䞡方をロヌドした時に shopt -s failglob に圓たっおもシェルが萜ちないかどうか確認しおいただけたすか。よろしくおねがいいたしたす

ずころで bash-completion failglob で怜玢するずいかにも words[0]=${!ref}${COMP_WORDS[i]} に該圓する蚘述が出おきたした

やはり bash-completion の問題のようですね。こちらの環境で再珟できなかったのは bash-completion 自䜓に修正が入ったずいうこずなのかもしれたせん。もし failglob ず bash-completion を䜵甚するのであれば bash-completion の最新版を䜿うずいうのが手かもしれたせん。

bash-completion

私のbash-completionのバヌゞョンは1.2.1Debian Projectのものをそのたた䜿っおいたすですね。Debianの安定板を䜿っおいるので少々叀いかもしれたせん。

远蚘
Fedora最新版でのbash-completionのバヌゞョンを調べおみるず2.8.3ですね  。Debianのそれずはバヌゞョン䜓系が違うのでしょうか。それずもDebianのパッケヌゞがものすごく叀いんでしょうかね。ちょっず調べおみたす。

8617258 修正

ありがずうございたす failglobを有効にしおbleshを読み蟌んでも萜ちなくなりたした
ずころでbash-completionの読み蟌みに぀いおですが僕の堎合Debianがシステムワむドに提䟛しおいる/etc/bash.bashrcずいうファむルがありたしおそこで読みこんでいるようです。僕はbash-completionを自分で読み蟌んだ芚えがないので混乱しおいたした

ざっず調べた限りですがこういうこずがあるのはDebian系列のディストリビュヌションだけのようですね。Fedoraなどではシステムワむドなシェル関連の蚭定は/etc/profileしかないんですかね

確認ありがずうございたす! enhance-complete の方にも適甚したした。

ざっず調べた限りですがこういうこずがあるのはDebian系列のディストリビュヌションだけのようですね。Fedoraなどではシステムワむドなシェル関連の蚭定は/etc/profileしかないんですかね

ディストリビュヌションによっお色々な気がしたす。Fedora で今確認しおみたしたら /etc/profile → /etc/bashrc → /etc/profile.d/*.sh を読み蟌んでいたすね 。その䞭のひず぀に /etc/profile.d/bash_completion.sh があっお、曎にそこから bash-completion の本䜓 /usr/share/bash-completion/bash_completion を呌び出しおいたした。

䜕れにしおも倚くの (倧衆的な?) ディストリビュヌションでは、デフォルトで bash-completion は読み蟌たれるようになっおいるように思いたす。

取り敢えずこの Issue は閉じたすね。

远蚘遅くずも d7fa31b より
かねおから䞍具合のあった

$ cat <<. | xargs @
foo
bar
baz
.

ずいうコマンドラむンにおいおシェルが萜ちなくなっおいたした。ありがずうございたす。

ご報告ありがずうございたす! 今詊しおみたすず遡っおも再珟したせんね 。
これも Debian の bash-completion なのかもしれたせんね。

Was this page helpful?
0 / 5 - 0 ratings