60

This question already has an answer here:

Where can (should) I put my (bash) script so that it can be used (forever) by terminal or by a direct command: Alt+F2?

I know there is /usr/bin and /sbin & /bindirectories but when should I use between them?

Where should I put my script?

marked as duplicate by guiverc, Thomas, Volker Siegel, waltinator, N0rbert Sep 16 '18 at 20:47

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

  • 7
    Please read this, and this questions to understand all about this directories – c0rp May 13 '14 at 4:57
60

Don't use these directories:

/usr/bin, /sbin and /bin

Leave them for package-managed executables.


If you need the script for one user, waltinator's answer is fine.

If you need the script for all users on your system (but you can also use this for one user), stick it in /usr/local/bin/. One advantage: this directory is already in your PATH so there is no need to edit files.

  • At least in my installation of Ubuntu 14.04, executables in /usr/local/bin are not available to cron jobs (run by the web user). However, programs in /usr/bin are. – juacala Feb 3 '18 at 16:40
81

It depends on who will use your script:

  • Yourself only - $HOME/bin like @waltinator said
  • You and other local users - /usr/local/bin
  • root only - /usr/local/sbin

That way you have your own scripts separated from the distribution-provided binaries.

  • Traditionally, the .../sbin directories are used for statically-linked binaries (mostly used by root, before shared libraries are available), not user scripts. – waltinator May 13 '14 at 12:12
  • 2
    That only applies to /sbin, not /usr/sbin or /usr/local/sbin. The Filesystem Hierarchy Standard states that "Locally installed system administration programs should be placed in /usr/local/sbin." [link]. – Twinkles May 13 '14 at 12:45
  • 1
    This is all true, but the sbin directories are being phased out and there really is no reason to separate them. For more on that, see here. – terdon May 13 '14 at 14:19
  • 1
    I see a discussion about phasing them out, and while the arguments are compelling, the current recommendation is the one I quoted above. – Twinkles May 13 '14 at 14:49
  • And, four years later, the recommendation still stands: FHS 3.0 – Twinkles Jul 13 '18 at 7:29
43

You should put your script under $HOME/bin. Follow below PATH to achieve this:

  1. Create a folder using mkdir $HOME/bin
  2. Then put your script in $HOME/bin

  3. Finally, add the following line under $HOME/.bashrc by editing with gedit $HOME/.bashrc

export PATH="$HOME/bin:$PATH"

When the system is looking for the command you typed, it will look in each directory of $PATH and execute the first match it finds.

  • 3
    I am not sure I understand. First put it in $HOME/bin, then create the directory? Also, scripts in $HOME/bin are found by default, no need to add it to $PATH. – Jacob Vlijm May 13 '14 at 5:17
  • 7
    @JacobVlijm: It's "found by default" since it's added to $PATH in ~/.profile. ;) – Gunnar Hjalmarsson May 13 '14 at 6:24
  • @GunnarHjalmarsson You are right, what I meant was: so you do'nt need to add it add it once more :) – Jacob Vlijm May 13 '14 at 8:16
  • 2
    Adding $HOME/bin to the start of your path will make sure your scripts get seen before any elsewhere on the system. While this is convenient, it opens you up to all sorts of unexpected behaviors if one or more of your scripts has the same name as a command somewhere else in your path. This could potentially open security vulnerabilities as it it is much easier to gain access to a user account than one with elevated privileges. E.g. someone adding a script named ls to your bin directory that really runs an rm -rf * . Adding your $HOME/bin to the end of your path avoids most such problems. – Joe May 15 '14 at 3:35
  • 1
    Just had the same question: ~/.local/bin is already in the PATH. Any reason against using it for personal scripts? – Joschua May 31 at 12:02

Not the answer you're looking for? Browse other questions tagged or ask your own question.