例えばsudo -u postgresでpsqlを実行したいが、psqlのコマンドパスはpostgresユーザにしか通っていない場合、コマンドの前に-iオプションをつければよい。

sudo -u [user] -i [command]

-i はsimulate initial loginの意味で、シェルがログインシェルとして実行されるため、各種環境がuserのもので設定されたうえでコマンドを実行できる。

ただしsudo -iの場合にセットされる環境変数はsu -した場合と全く同じになるとは限らない。/etc/sudoersやsudoのversionによって異なる可能性があるが、以下のように差が出る。

## version情報
$ bash --version | head -1
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
$ sudo -V | head -1
Sudo version 1.8.19p2

## 現在のPATH
$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/usr_x/.local/bin:/home/usr_x/bin

## sudo -iをつけて実行
$ sudo -i echo \$PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/usr_x/.local/bin:/home/usr_x/bin:/root/bin

## sudo -iをつけて実行(shを通して実行)
$ sudo -i sh -c 'echo $PATH'
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/usr_x/.local/bin:/home/usr_x/bin:/root/bin

## su -してから実行
$ sudo su -
# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

大体の場合はsudo -iで問題なくPATHが通るが、万が一うまく行かないことがあれば、su -したうえでコマンドを実行するか、次のようにsu -(su -l)に-c commandオプションを加えて実行するといい。

$ sudo su -lc 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin