DEV Community

Cover image for Demystifying Linux: The purpose of /bin, /usr/bin and /usr/local/bin
Sneh Chauhan for Kubernetes Community Days Chennai

Posted on • Updated on

Demystifying Linux: The purpose of /bin, /usr/bin and /usr/local/bin

Introduction

Linux is a Unix-like, open source and community-developed operating system for computers💻, mobile devices📱, servers🖥 and embedded devices. Whether you know it or not, Linux is everywhere from your smartwatch⌚ to self-driving cars🚗.

Linux was known for being less intuitive and only for people who do tech-stuff but time has changed ⌛. Linux has something for everyone.
It has GIMP as a Photoshop alternative, Gedit as a Notepad alternative, VLC media player as a Windows media player alternative and many such software alternatives.

If you have been a Windows user💻 and have switched to Linux to look super nerdy🤓 or to crack linux jokes(yeah some people do), you might find it hard even to do basic things like copying, moving and deleting files or switching between directories.

Let's say you're exploring Linux for the first time, and you happened to be in the top level root directory(/). Now if you typed ls, you may come across a lot of the stuff which you think you know about. But it's highly likely that you interpreted it wrong.

For example, /bin might sound analogous to the Recycle Bin in Windows but that's not the case. Both are way different.

Although most of the modern Linux distributions come with the GUI, the real power of Linux is in it's CLI👨‍💻 and not GUI.

Linux File Hierarchy Structure

Linux file hierarchy structure describes the directory structure and it's contents in Unix and Unix-like Operating systems. It is maintained by Linux Foundation.

Image description

You can learn more about it here.

Difference between /bin and /usr/bin

For checking the difference between /bin and /usr/bin, type in the command :



man hier | grep -E '/bin$|^.{7}(/bin)' -A2


Enter fullscreen mode Exit fullscreen mode

It would give output :



snake@Snake:~$ man hier | grep -E '/bin$|^.{7}(/bin)' -A2
       /bin   This  directory contains executable programs which are needed in single user mode and to bring the sys‐
              tem up or repair it.

--
       /usr/X11R6/bin
              Binaries which belong to the X-Window system; often, there is a symbolic link from the more traditional
              /usr/bin/X11 to here.
--
       /usr/bin
              This is the primary directory for executable programs.  Most programs executed by  normal  users  which
              are  not  needed  for booting or for repairing the system and which are not installed locally should be
--
       /usr/local/bin
              Binaries for programs local to the site.


Enter fullscreen mode Exit fullscreen mode

The output says it all.
So, that's all for the blog. I hope you understood it.
.
.
.
.
Well, not really. There's a good historical reason for this split.

Back in time, when Ken Thompson and Dennis Ritchie were developing UNIX on a PDP-11, they used a pair of RX05 disks of 1.5 MB each.

As the Operating system grew bigger in size, first RX05 disk got filled up. So, a second RX05 disk was used and the mount was created by the name /usr. All the directories like /bin, /sbin, /tmp were replicated under it.

So, First RX05 disk contained the binaries which would help in its bootup(like single-user mode).
And the Second RX05 disk contained a lot less and least used binaries during that time until multi-user mode came into existence.

As the time passed the storage capacity on a disk drive increased exponentially and in this modern world, even the throwaway disk will have at least multi-gigabyte capacity. So, for a person born in this era, it's hard to imagine why the split would be made.

What about /usr/local/bin ?

/usr/local/bin contains binaries of the third-party apps we install. Any local executable that didn't come with the Linux install may get it's place here.

Same is the case with /sbin which contains the binaries for root users.

Top comments (6)

Collapse
 
abdmun8 profile image
Abdul Munim

Thank you, this is a good article Sneh Chauhan, keep writing.

Collapse
 
sneh27 profile image
Sneh Chauhan

Glad you liked it Abdul !😃

Collapse
 
designbyonyx profile image
Ryan Wheale • Edited

This was super helpful. I am wanting to install a single-file program (git-filter-repo to be exact). Based on your article, it seems like the most appropriate place to install is /usr/local/bin?. It might be cool to list the simple "rules of thumb" for deciding where to save different programs... for us dummy's.

Collapse
 
romulo profile image
Romulo • Edited

That's correct!
Generally you can also copy it to ~/.local/bin if you don't need to make it available to other users as well.

Collapse
 
helix751 profile image
KonektaCL

Hi. Are ~/.local/bin and similar ~/ user locations standard in Linux? I've found differences in various Linux flavors (Mint vs plain Ubuntu vs Debian vs Raspbian.

Collapse
 
romulo profile image
Romulo • Edited

Hi! Yes, these are also standart. They came after multi-user mode as a way to install programs for a single user in a multi-user environment. As root/admin you generally don't want regular users to edit system folders (or to pester you all the time to install stuff), so you add ~/.local/bin to $PATH and voilà,now every user can install their stuff without breaking anything.