Hey I want to add a command to my system. I am not using any package-format or anything. I just want to install a script that I wrote.

I know of some ways to do that:

  • add my script into whatever is the first thing in $PATH
  • add a custom path to $PATH (in /etc/profile.d/ or /etc/environment) and put the script into the custom path
  • add my script into /usr/bin or /usr/local/bin

I remember reading that profile.d/ doesn’t get picked up by all shells and that /etc/environment (which exists but is empty on my system) shouldn’t be used.

What should I do to ensure that my command will be available everywhere on any gnu/linux or bsd system?

EDIT: I should clarify that I am asking this only out of curiosity. I just like knowing how this stuff works. The script was just an example (I thought this would make it easier to understand, lol). I am interested in knowing a way to install a command without any chance of that command later not being found by other programs. I find many different answers to this and they all seem a little muddy, like “doing x should usually work”. I want to know the solution that always works

  • hallettj@beehaw.org
    link
    fedilink
    English
    arrow-up
    8
    ·
    edit-2
    1 year ago

    There are specs for that!

    For system-wide installation the Filesystem Hierarchy Standard essentially says:

    • put it in /usr/local/bin/ if you want to drop a script somewhere
    • or put it in /usr/bin/

    Both should be in the default $PATH for most systems.

    For single-user installs the XDG Base Directory Specification says,

    User-specific executable files may be stored in $HOME/.local/bin. Distributions should ensure this directory shows up in the UNIX $PATH environment variable, at an appropriate place.

    Those locations will work in 99% of cases.

    Nothing will work for every case because Linux systems are many and varied. For example I’m on NixOS which doesn’t adhere to that particular provision of XDG, and doesn’t adhere to any of FHS.