タブ補完中に bash が $ をエスケープしないようにするにはどうすればよいですか?

タブ補完中に bash が $ をエスケープしないようにするにはどうすればよいですか?

コマンドラインには次のように記述します:

ln -sf $PWD/wine-

そしてTabファイル名を補完するために を押します。Ubuntuの以前のバージョンでは、これでファイル名を補完できましたwine-(そして副作用として$PWDその時点で展開されました)。しかし今は

ln -sf \$PWD/wine-

これは私が意図したこととは全く異なり、ファイルが文字通り で始まっていないため、何も完了しません$

完了を、より破損の少ない動作に戻すにはどうすればよいですか?

set現在の設定は次のとおりです:

BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

答え1

私はそれを見つけましたbash バージョン >= 4.2.29新しいdirexpandショップ設定があります。(man docs/bash.1新しいbashをチェックするか、bash.1 8951行目から

Quantal Quetzal 12.10 を使用する場合、または新しい bash を入手 (またはチェックアウトしてビルド) する場合は、次のようになります。

shopt -s direxpand

私が望み、必要とし、愛する行動を与えてくれます。

回避策: とりあえず、 の代わりにCtrl+ Alt+ を使用すると、必要な処理が実行されます。ただし、扱いにくいです。ETab

ところで、「bashタブ変数の拡張に関する質問?」というスレッドがいくつかあります。gnu.bash.バグそれらを読んで、ここに情報を見つけました。

答え2

shopt -u progcomp

これで問題は解決しました。また、多くの「インテリジェント」な補完オプションも削除されました。これらのオプションは、特定のコマンドの引数として必要ないと愚かな人が判断したために、存在がわかっているファイルを補完しないという邪魔になることがわかりました。ARRRGH

答え3

_filedir()トップレベルのbash_completionスクリプトを検索し、次の行を変更します。

compopt -o filenames 2>/dev/null

compopt -o filenames -o noquote 2>/dev/null

答え4

12.04 を使用している場合 (私のような場合)、$PWD の代わりに ~+ を使用できます...

例えば ​​:

cd /bin
echo ~+/ls
/bin/ls

関連情報