Ubuntuで使用されるBash Completionライブラリにバグを発見しました。
これは何を意味するのでしょうか?
Ubuntuはbash補完ライブラリを使用してbash補完をスマートにします。このライブラリはにあり/usr/share/bash-completion/bash_completion
ます。
基本的に、このライブラリは、典型的なコマンドとそれらを完了する方法を知っているいくつかの巧妙な関数を宣言します。を押すたびにTab、このライブラリ内の関数が呼び出され、現在のコマンドラインを完了しようとします。したがって、たとえば、入力apt-get i
Tabすると、それが完了しapt-get install
ます。そのライブラリをソース化しない場合、標準のプリミティブなbash補完しかありません-たとえば、apt-get i
Tabソース化せずに入力すると、bashは現在のディレクトリ内のファイルを探してi
、コマンドに従ってコマンドを完了しようとしますこれらのファイル名。
なぜrootとして起こらないのですか?
あなたsudo su
が自分自身を作るために使用するときroot
、bash補完ライブラリがソースされていないためです。あなたsudo -i
が自分自身を作るために使用する場合、これは異なりますroot
。バグが表示されると思いますか?たとえば、「sudo su-」と「sudo -i」と「sudo / bin / bash」を参照してください-どちらが使用されるか、または何が問題になるか 違いに慣れていない場合。
私の場合は、通常のユーザーとして、ライブラリは、私はbashシェルを起動したときにソースなぜならます~/.bashrc
ソース/etc/bash_completion
どのソース/usr/share/bash-completion/bash_completion
。
私が使用している場合sudo -i
のようにログインするためにroot
、ライブラリーがあるためにソースを取得します/etc/profile
ソース/etc/profile.d/bash_completion.sh
のソースを/usr/share/bash-completion/bash_completion
。
なぜそのバグが起こっているのですか?
このコマンドを実行してください:
$ eval 'quoted=$(cat' env.
bash: unexpected EOF while looking for matching `)'
bash: syntax error: unexpected end of file
おなじみ?;-)実際、それはまさにTabあなたが説明したコンテキストでヒットしたときに舞台裏で起こったことです。より正確には、バグは_quote_readline_by_ref
によって宣言された関数にあります/usr/share/bash-completion/bash_completion
。そのファイルを入手した場合は、その機能を使用可能にする必要があります。次に、これを試してください:
$ _quote_readline_by_ref '$(cat env.' quoted
bash: unexpected EOF while looking for matching `)'
bash: syntax error: unexpected end of file
これらの引数が与えられると、関数_quote_readline_by_ref
はとりわけeval
上記のことを実行します。必要に応じて見ることができます。そして、あなたがをタイプしたときenv $(cat env.
Tab、その関数はまさにそれらの引数で呼び出されました。だからそれが起こったのです。
このeval
ハックは別の問題を修正するはずでしたが、プロセスにこの他のバグが導入されたと思います。
どうすれば修正できますか?
このバグはすでに報告されていることが判明しています。そのバグレポートを読んだ後、それを修正する3つの方法があります。
パッチを当てる:そのバグレポートのコメントの1つで、誰かが行を置き換えることを提案します
[[ ${!2} == \$* ]] && eval $2=${!2}
_quote_readline_by_ref
ファイル内/usr/share/bash-completion/bash_completion
の行内の関数内
[[ ${!2} == \$\'* ]] && eval $2=${!2}
これをしないことをお勧めします。そのコメントを書いた人はbash-completionの開発者ではないようです。この修正プログラムは、ステートメントの左側のオペランドをfalseに評価するだけで、それが発生しないようにeval
します。ただし、その関数が何をするのか、どのコンテキストで呼び出されるのかについての十分な知識がなければ、これが他の意図された機能を破壊しないかどうかは不明です。
最新バージョンを入手する:そのバグレポートでも述べたように、このバグはgit headには存在しません(他の変更の中でも、関数_quote_readline_by_ref
は単純化されています)。Gitから現在のリビジョンを簡単に複製できます。
git clone https://salsa.debian.org/debian/bash-completion.git
...そして、bash_completion
スクリプトの最新バージョンをコピーします/usr/share/bash-completion
(より安全に感じられる場合を除き、古いバージョンをバックアップする必要はありません。問題が発生した場合sudo apt-get install --reinstall bash-completion
は、行った変更を元に戻す必要があります)。これを直そうと急いでいるならお勧めします。:-)
これらのソリューションはいずれもコマンド置換の内部でbashを完了させないことに注意してください。同じバグレポートで述べたように、これはBash 4.3で壊れています。
- 座って待ってください:遅かれ早かれ、新しいバージョンがリリースされ(コマンド置換内のbashの完了も修正される可能性があります)、将来のUbuntuバージョンで入手できます。それが私が目指していることです;-)