If you’ve read any instructions on the web for how to install something, you’ve likely read a statement about adding something to your $PATH. More specifically, it probably included an export statement, a directory, and then a file into which to pipe the command, right?

In fact, you may see a directive like this:

Make sure the ~/.composer/vendor/bin directory is in your system’s “PATH”.

Which means that you should do something like the following:

export PATH="$PATH:$HOME/.composer/vendor/bin"

But if you’re new to working in the terminal, let alone environmental variables, how are you supposed to know how to translate the statement into the above command?

Shells in macOS

Before getting into what a shell is, it’s important to note that the terminal is basically the way to access the file system through a series of commands and text-based programs.

They’re popular especially in *nix-based operating systems, through Windows has it, too (if you ever used MS-DOS or the Command Prompt then you know what I mean).

For this post, I’m primarily talking about *nix-based systems and, even more specifically, macOS. So when it comes to talking about shells in macOS, you’re talking about the program that interprets the commands entered into the terminal.

That’s all, nothing fancy.

So what are the different shells in macOS? There are typically four shells that come with the operating system (though you can install more, if you like).

macOS Shells

These shells include bash, ksh, tcsh, and zsh. Noe that some people will claim one shell is better than the other whereas others (like myself) are a bit ambivalent. I tend to stick with Bash since that’s what I’ve used the longest and know the best (though I will say Oh My Zsh., which I’ll cover momentarily, has been nice to tinker with, too).

For most macOS installations, this is the default shell. This means that all settings are going to be kept in a .bash_profile file. So any time you want to add anything to your path, this is the file into which it’s written. There are other files, but they are outside the scope of this post.

Understanding Profiles

Whenever you’re working in a terminal and you make a change to the file associated with that terminal session (that is, the instance of the terminal you have open), you have tell the operating system to load those changes via the following command:

$ source ~/.profile

…where ~/.profile is the shell’s profile file. Note, however, that for many shells this is only consistent for the session of the terminal. It does not mean that it will persist the next time you open the terminal let alone your operating system.

This is because a given shell may have a hierarchy, so to speak, of files. For Bash, this includes .bashrc, .bash_profile, and .profile. Furthermore, you may be able to define the settings in your operating system’s Terminal settings.

For example, if you’re using Linux:

Shells in macOS: Linux Terminals

If, on the other hand, you’re using macOS, then you’d need to use one of the aforementioned files. Using bash as an example, I’ll break down how they all fit together:

  • .profile is the login script. If one doesn’t exist, you can create one and this will execute the commands you have upon login to the session. If you want to have something execute or something available just during login, this is the file. This is also system-wide.
  • .bashrc is a file that’s read during a terminal session (or even when the GUI is being used). Think of this is both login and interactive. So if you want something available during login and when using the OS, this is a file you can use.
  • .bash_profile is available run during login and it’s dedicated towards an individual’s account.

Is There More?

Since this is a quick guide, yes, there’s more. You can read them in the man page specific to your terminal. For bash, simply enter

$ man bash

In your terminal and you’ll be given the complete guide to the terminal.

Shells in macOS: man bash

As a take away, here’s what you may stumble across when it comes to the profile files:

  • /bin/bash. The bash executable
  • /etc/profile. The systemwide initialization file, executed for login shells
  • ~/.bash_profile. The personal initialization file, executed for login shells
  • ~/.bashrc. The individual per-interactive-shell sta. rtup file
  • ~/.bash_logout. The individual login shell cleanup file, executed when a login shell exits
  • ~/.inputrc. Individual readline initialization file

The next time you need to export a path, set a value, or work with your profile, this should hopefully give you a guide as to where the change needs to be made (and how you can do it).