blog.hekt.org

なんで末尾にスペース入れるだけで sudo で alias を有効にできるわけ?

通常、sudo でコマンドを実行すると alias が有効になりません。これを解決するために、alias sudo='sudo ' と sudo の後ろにスペースを入れた alias を設定するというテクニックがあるのですが、なんでこれで alias が使えるようになるわけ? という話。

例えばこういうこと:

$ alias ll='ls -l'
$ sudo ll
-bash: ll: command not found
$ alias sudo='sudo '
$ sudo ll
drwx------   1 hoge  fuga   512  5 29 00:00 nyan
 ...

答えは Bash のマニュアルに書いてありました。

The first word of each simple command, if unquoted, is checked to see if it has an alias. […] If the last character of the alias value is a space or tab character, then the next command word following the alias is also checked for alias expansion.

最初のコマンドが引用符で囲まれていない場合に alias を確認する。alias の値がスペースかタブで終わっていればその次のコマンドも確認する、と。

なんか裏技的な手法だと思っていましたが、普通に仕様みたいです。

でもこれって、例えば nice コマンドとかでオプションを取る場合どうすりゃいいんでしょうかね。滅多にあることじゃない (使ったことない) ので、素直にフルパスを入力すればいいだけの話ではあるのですが……。