それマグで!

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

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

sudo で シェルのaliasされたコマンドを使えるようにするけど、環境変数を渡さない。

sudo するとコマンドnot found

あああ、、もう。

takuya@sakura:~$ sudo ll
sudo: ll: command not found

alias に頼り切ってると、こういうことが頻繁に起きる

解決策

alias sudo='sudo '

コレが解決策

間違った解決策: preserve Environment

sudo -E 

環境変数を渡してしまうと、意図通りの動作をしない可能性があったり、ミスを誘発するから絶対ダメ。(間違いとは言いすぎかもしれないが、過剰な環境変数の引き継ぎは意図しない動作を引き起こしてしまう)

このオプションは、現在の環境変数をすべて sudo 実行時に引き継ぐのでトラブルのもとになると思いう。

alias でうまくいく理由。

たぶんだけど、alias の展開が再帰的に行われるから 。

alias を使って再帰的な展開をつかってbashに解釈させるってことですね。

sudo のかわりに _sudo として考えてみる。

alias ll='ls -l'
alias _sudo='sudo '
_sudo ll

こう書いたとき、alias が展開されるとき、_sudo ll は sudo ls -l として順番にalias を展開済みにしてから プロセスが起動される。

# alias が  alias を展開して
$  _sudo ll 
   →  sudo ll  # ここで更に展開
      →  sudo ls -l
$ sudo ls -l # コレが実行される。

再帰的なalias展開を使うという、シンプルで盲点な解決策があるってことに気づかなかった私を殴りたい。

参考資料

https://wiki.archlinux.jp/index.php/Sudo#.E3.82.A8.E3.82.A4.E3.83.AA.E3.82.A2.E3.82.B9.E3.82.92.E6.B8.A1.E3.81.99

追記 2018/10/28

はてなブックマーク - tarumeのブックマーク / 2018年10月17日

よくわからない説明されてるけど、公式読むと→ http://www.gnu.org/software/bash/manual/bashref.html#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.

再帰的に展開するっていう説明じゃよくわからないですか。すいません。書き方一部変更します。