How to start a shell without any user configuration?

32,784

Solution 1

You can pass the --noprofile and --norc command-line options:

$ bash --noprofile --norc

You will find documentation about these options in the man page.

Solution 2

Running bash --noprofile --norc still inherited from parent process. Based on a similar question I found that the way I interpreted this question env -i bash --norc --noprofile was what I would want.

Solution 3

Use --noprofile --norc:

   --noprofile
          Do  not  read either the system-wide startup file /etc/profile or any of the personal initializa‐
          tion files ~/.bash_profile, ~/.bash_login, or ~/.profile.  By default,  bash  reads  these  files
          when it is invoked as a login shell (see INVOCATION below).

   --norc Do  not  read  and  execute the system wide initialization file /etc/bash.bashrc and the personal
          initialization file ~/.bashrc if the shell is interactive.  This option is on by default  if  the
          shell is invoked as sh.

(from the manpage).

Solution 4

It is often desirable to launch an entirely blank bash:

  • no environment variables carried from the parent shell;
  • an empty home dir without any package-specific configuration files (e.g. .gitconfig and .local/...);
  • no shell configuration files.

This works for me both on MacOS and Linux:

env -i HOME=$(mktemp -d) bash --noprofile --norc
cd

In that bash shell, the HOME dir is that test dir just created (change the name if needed), and there are no particular settings. The only environment variables that are set are PWD, HOME, and SHLVL.

Upon starting bash, the PWD is where we were before, so we need to do that initial cd.

Example (Linux):

$ env -i HOME=$(mktemp -d) bash --noprofile --norc
bash-5.0$ cd
bash-5.0$ pwd
/tmp/tmp.mwgHRQE1aJ
bash-5.0$ printenv
PWD=/tmp/tmp.mwgHRQE1aJ
HOME=/tmp/tmp.mwgHRQE1aJ
SHLVL=1
OLDPWD=/home/xxxxxxxxxxxxxxxxx
_=/usr/bin/printenv
bash-5.0$ 
Share:
32,784

Related videos on Youtube

lil
Author by

lil

Updated on July 19, 2022

Comments

  • lil
    lil almost 2 years

    I need to use a "clean" shell (e.g. bash) under Linux/OSX terminal without any user configuration, but it reads config info from some files (e.g ~/.bashrc) every time it starts. I can modify the file every time I need a "clean" shell, and revert it back when I finished, but is there any easier ways to do this, for example a command?

    • Gurjeet Singh
      Gurjeet Singh about 4 years
      The answers provided below are also useful when, say, one makes a mistake in their .bashrc or .bash_profile files that causes the shell to exit prematurely.
  • DaoWen
    DaoWen almost 9 years
    Thanks for the env -i tip! This ended up being a little too clean for me, since I just wanted to get rid of my custom settings, but I still needed the system-wide settings. This is what I ended up using: env -i bash --rcfile /etc/profile
  • nnutter
    nnutter over 8 years
    bash --noprofile --norc still inherits from parent process.
  • Marnix A.  van Ammers
    Marnix A. van Ammers over 7 years
    Great tip. The "env -i" is exactly what I needed. My bash_profile was still being read in despite the "--noprofile --norc" .
  • Chad
    Chad almost 7 years
    You didn't need the argument --noprofile as it's only relevant if you have a login shell.
  • wisbucky
    wisbucky over 6 years
    This was good enough for me. Got rid of my aliases, prompts, etc.
  • vulcan raven
    vulcan raven over 4 years
    It still inherits the history.
  • thc
    thc almost 3 years
    What's the difference between env -i bash --norc --noprofile and bash --norc --noprofile?
  • David Xia
    David Xia about 2 years
    @thc according to man page, -i, --ignore-environment start with an empty environment
  • Harmen
    Harmen almost 2 years
    env -i PATH=/usr/bin:/bin "TERM=$TERM" "HOME=$HOME" bash --noprofile --norc