How to add a path to system $PATH for all users's non-login shell for debian

17,009

Solution 1

On Debian and other systems that use PAM (which is most of them nowadays), you can set environment variables (including PATH) in /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).

Solution 2

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

to my $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 $PATH.

Because the additional software is not necessary stable i prefer $HOME/.profile over /etc/profile.


A small remark: /etc/.profile respectively $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.

Solution 3

I found the most excellent answer on serverfault by Gilles:

How set PATH for all users in Debian?

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 /etc/profile.

If you only need that PATH setting 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/bin won't work there).

Share:
17,009

Related videos on Youtube

Yang Bo
Author by

Yang Bo

Updated on September 18, 2022

Comments

  • Yang Bo
    Yang Bo over 1 year

    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?

  • Yang Bo
    Yang Bo over 11 years
    /etc/profile is not executed by non-login shell.
  • Yang Bo
    Yang Bo over 11 years
    Neither /etc/profile nor ~/.profile is not executed by non-login shell.
  • user1146332
    user1146332 over 11 years
    You are right, my answer is not fully related to your question. I just described what i did to get things running. If you aren't using X my approach does what you want since every non-login shell is a child-process of the login-shell. If you are using X you can source the little script i have posted in the init file of your display manager (in most cases Xsession). Now every child process of the display manager have the defined $PATH variable. In the described two cases my approach definitely works and you can access every binaries under /opt/.*/bin.