それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bash のチルダ展開をやめさせる方法。

bash がチルダを展開しちゃって読みづらい。

vim ~/.bash<TAB>
vim /home/takuya/.bashrc  # 展開される。

この展開をやめさせる方法。

展開は2つで行われる。

ひとつは、 .inpurc の設定。

もうひとつは bash_completionの補完

.inputrc による展開の設定

takuya@~/Desktop$ bind -v | grep tilde
12:set expand-tilde off

ここがオフになっていることを確認する。

on の場合は、

echo "set expand-tilde off " >> ~/.inputrc

次に、bash_completion

bash_completion で _expand が定義されているのでソレを上書き

bash_completion には _expantion があるので、それが丁寧に展開してくれる。

takuya@~/Desktop$ type _expand
_expand は関数です
_expand ()
{
    if [[ "$cur" == \~*/* ]]; then
        eval cur=$cur;
    else
        if [[ "$cur" == \~* ]]; then
            cur=${cur#\~};
            COMPREPLY=($( compgen -P '~' -u "$cur" ));
            [ ${#COMPREPLY[@]} -eq 1 ] && eval COMPREPLY[0]=${COMPREPLY[0]};
            return ${#COMPREPLY[@]};
        fi;
    fi
}

いまは、展開されたくないので、コレをオフにする。というか、上書きして無効化する。

echo "_expand () { return 0; }" >> ~/.bash_completion

これで、bash が ~/ を展開しなくなる。便利ね。

これ、ずっとinputrc だと思ってて、inputrc を設定したのにexpandが停止しないか謎だった。

参考資料

How to stop bash from replacing "~/" with "/home/username"?