読者です 読者をやめる 読者になる 読者になる

絶品ゆどうふのタレ

ふと気づいたことを綴るだけのメモ

自分好みの環境をsudo時にも使えるようにする

linux shell tips

以下のように.*shrcに記述しておくと、自分のshellで設定した内容のほとんどをsudo後にも引き継ぐことが出来て、ちょっと便利。

alias sudo='sudo -E '

これだけ。これは2つのことをやっていて

  • 実行ユーザーの環境変数の大部分をsudo後も引き継ぐ
  • 実行ユーザーのalias設定をsudo後も引き継ぐ

という効果がある。

環境変数の引き継ぎ

前者の、環境変数の引継を実現しているのは、-Eオプション。

これは、正確には環境変数を引き継いでいるのでは無く、sudoersで設定されているenv-resetを無効にする効果がある。
そのため、$USER/$LOGNAME/$PATHなどの環境変数は(defaultでは)rootで上書きされるのだが、$HOMEは実行ユーザーのままだったり、$LV/$EDITORなども引き継がれたりする。


もちろん、これはsudoersのenv周りの設定をきちんと整えればオプション無しでも同じ事が実現できるのだが、自分のポリシーとして「カスタマイズの範囲は、効果/編集共に最小限の影響にとどめるべし」という思いがあるので、ユーザー側の設定で出来るならその方が良いと思う。


というわけで、-Eつけておくとsudoでvimを使っても自分の.vimrcがそのまま使えて素敵。

aliasの引き継ぎ

aliasは環境変数では無く、shell自身がalias一覧を保持して管理している。
そのため-Eオプションでは引き継がれず、sudo vi とか sudo ll とかやってしまうと悲しい思いをすることになる。

そこで、このalias設定の引き継ぎをどうにかしたいわけだが、これは、aliasに最後のスペースを入れることで実現する事が出来る。


これ、どういうことかというと、man bash(1)のALIASESの項を見ると答えが載っている。

If the last character of the alias value is a blank, then the next command word following the alias is also checked for alias expansion.

要するに、「aliasの最後にblank文字を入れておくと、このaliasの後に続けたコマンドでもalias設定使うよ!」ということ*1

なので、通常ではaliasが利用されないsudo ll とかでもちゃんとllできるし、sudo vi でもvim開く。素敵。


なお、念のために言っておくと、この辺の設定は「sudo権限かどうかが視覚的に判別しにくくなる」っていう、不便さが生んでいた偶然の抑止力を排除することになるので、おっちょこちょいさんは+アルファで何か視認性のよい判別用設定を加えておいた方が良いんじゃないかと思います。*2


というわけで、1行のalias説明でもこんなに文章かけるよっていう話でした(違

*1:要するにって言ったけど要してない。訳してる。

*2:僕もなんかそういうの考えつくまではクリティカルなところではやらないつもりでいます。