After installing some programs in
/opt/xxx/bin, I want to add
/opt/xxx/bin to system
$PATH for all users's non-login shell. What should I do?
On Debian and other systems that use PAM (which is most of them nowadays), you can set environment variables (including
/etc/environment. This will work for any login method that uses the
pam_env module (either in the
auth section or in the
session section); on Debian that should be all of them (at least the ones that provide ways to log in and run commands).
The default path could be set in
/etc/profile like Joe said but also in
$HOME/.profile. I also have plenty of packages i compiled on my own (with the common procedure
./configure --prefix=/opt/<name>) installed in
/opt. To execute the binaries in
/opt/<name>/bin without any additional effort I added
OPTDIR=/opt for i in $OPTDIR/* ; do BINDIR=$i/bin if [ -d $BINDIR ] ; then if [ -z $PATH ] ; then PATH=$BINDIR else PATH=$BINDIR:$PATH fi fi done export PATH
$HOME/.profile which in your case would be
/etc/profile. Now even if i install packages under
/opt in the future i don't have to worry about accessing the related binaries in
/opt/.*/bin since the path is automatically added to
Because the additional software is not necessary stable i prefer
A small remark:
$HOME/profile is not executed by your default shell but by
dash. A lightweight variant of
bash which reduces the load during the boot process.
I found the most excellent answer on serverfault by Gilles:
The first place where PATH is set is
/etc/login.defs. There's a setting for root and a setting for everyone else.
Another place where you can define environment variables is
/etc/environment. These settings will apply to everyone (you can't write arbitrary shell code there).
A third place where you can define environment variables is
/etc/profile. There you can write arbitrary shell code. If you want a user-specific setting, there is the corresponding per-user file
~www-data/.profile. But this will only apply to console interactive logins; in particular it won't apply to cron jobs unless they explicitly source
If you only need that
PATHsetting in a user crontab, you can write it at the beginning of the crontab. Note that you need the full list (
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/zend/bin), you can't use a variable substitution (
PATH=$PATH:/usr/local/zend/binwon't work there).
The default path can be set in /etc/profile
But I was just looking on my Ubuntu system, and it's set in /etc/environment
su command resets your PATH environment value to one defined in /etc/login.defs by ENV_PATH and ENV_SUPATH variables. don't forget to configure this file. see here.