28

Are the concepts of login/non-login shells the same as the concepts of non-interactive/interactive shells (respectively)?

Or are the concepts orthogonal yielding four different combinations?

I am trying to get a clear picture of which .bashrc, .bash_profile scripts get sourced under various circumstances and I find that articles sometimes use these concepts interchangeably.

  • Specifically focusing on which scripts are sourced makes this a worthwhile question.. could the title be edited? – KCD Jul 19 '18 at 1:51
51
  • login shell: A login shell logs you into the system as a specific user, necessary for this is a username and password. When you hit ctrl+alt+F1 to login into a virtual terminal you get after successful login: a login shell (that is interactive). Sourced files:

    • /etc/profile and ~/.profile for Bourne compatible shells (and /etc/profile.d/*)
    • ~/.bash_profile for bash
    • /etc/zprofile and ~/.zprofile for zsh
    • /etc/csh.login and ~/.login for csh
  • non-login shell: A shell that is executed without logging in, necessary for this is a current logged in user. When you open a graphic terminal in gnome it is a non-login (interactive) shell. Sourced files:

    • /etc/bashrc and ~/.bashrc for bash
  • interactive shell: A shell (login or non-login) where you can interactively type or interrupt commands. For example a gnome terminal (non-login) or a virtual terminal (login). In an interactive shell the prompt variable must be set ($PS1). Sourced files:

    • /etc/profile and ~/.profile
    • /etc/bashrc or /etc/bash.bashrc for bash
  • non-interactive shell: A (sub)shell that is probably run from an automated process you will see neither input nor output when the calling process don't handle it. That shell is normally a non-login shell, because the calling user has logged in already. A shell running a script is always a non-interactive shell, but the script can emulate an interactive shell by prompting the user to input values. Sourced files:

    • /etc/bashrc or /etc/bash.bashrc for bash (but, mostly you see this at the beginning of the script: [ -z "$PS1" ] && return. That means don't do anything if it's a non-interactive shell).
    • depending on shell; some of them read the file in the $ENV variable.
| improve this answer | |
  • Nice explanation, but I still don't know why "That shell is normally a non-login shell, because the calling user has logged in already"? – L_K Jun 20 '17 at 2:41
  • Is there an easy way to add scripts to be run in non-interactive shells? – ceztko Jun 18 '18 at 10:36
  • Nothing clean, but see superuser.com/q/1205681/81584 – KCD Jul 19 '18 at 1:54
  • Graphically explained – Ivanzinho Jun 17 at 22:43
  • @ceztko /etc/bash.bashrc and ~/.bashrc are also run in non-interative shells. This why most (all?) distributions put an abort condition at the start of it by default. Add your commands in front of it, and you should be fine. However, be aware that /bin/sh is linked to dash, not bash, in debian. – Bachsau Jul 18 at 9:47

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