-1

I put "source /etc/profile" in /etc/bash.bashrc and unable to open terminal window in ubuntu 16.04, and now, whenever I try to open a terminal window, it closes after a few seconds. During those few seconds, there is no prompt and it does not except commands.

My /etc/bash.bashrc looks like

# System-wide .bashrc file for interactive bash(1) shells.

# To enable the settings / commands in this file for login shells as well,
# this file has to be sourced in /etc/profile.

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

source /etc/profile
alias login="sudo login"

# set a fancy prompt (non-color, overwrite the one in /etc/profile)
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

# Commented out, don't overwrite xterm -T "title" -n "icontitle" by default.
# If this is an xterm set the title to user@host:dir
#case "$TERM" in
#xterm*|rxvt*)
#    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
#    ;;
#*)
#    ;;
#esac

# enable bash completion in interactive shells
#if ! shopt -oq posix; then
#  if [ -f /usr/share/bash-completion/bash_completion ]; then
#    . /usr/share/bash-completion/bash_completion
#  elif [ -f /etc/bash_completion ]; then
#    . /etc/bash_completion
#  fi
#fi

# sudo hint
if [ ! -e "$HOME/.sudo_as_admin_successful" ] && [ ! -e "$HOME/.hushlogin" ] ; then
    case " $(groups) " in *\ admin\ *|*\ sudo\ *)
    if [ -x /usr/bin/sudo ]; then
    cat <<-EOF
    To run a command as administrator (user "root"), use "sudo <command>".
    See "man sudo_root" for details.

    EOF
    fi
    esac
fi

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
    function command_not_found_handle {
            # check because c-n-f could've been removed in the meantime
                if [ -x /usr/lib/command-not-found ]; then
           /usr/lib/command-not-found -- "$1"
                   return $?
                elif [ -x /usr/share/command-not-found/command-not-found ]; then
           /usr/share/command-not-found/command-not-found -- "$1"
                   return $?
        else
           printf "%s: command not found\n" "$1" >&2
           return 127
        fi
    }
fi

This is my /etc/profile

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
export NODE_REPL_HISTORY=""
unset HISTFILE
set +o history
alias login="sudo login"

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi 

I am 99% sure that the reason the terminal closes is the infinite loop I accidentally created, where one calls the other and the other calls the one.

What can I do?

  • well, good (or maybe bad) news are that you are right, you are calling . /etc/bash.bashrc from /etc/profile vice-versa... is the Ubuntu virtual or physical? e.g. cloud or hardware? – Christopher Díaz Riveros Aug 27 '17 at 2:31
  • @Christopher It is a physical computer in my possession, not on the cloud. – John Militer Aug 27 '17 at 2:35
  • 1
    What happens if you type the Ctrl+C character during those few seconds? – Mark Plotnick Aug 27 '17 at 4:10
  • Switch to the console mode then remove the added line – GAD3R Aug 27 '17 at 14:23
1

The problem is indeed the infinite loop. The shell reads /etc/profile, sees that it needs to read /etc/bash.bashrc and does so, sees that it needs to read /etc/profile and does so, etc. Eventually the shell decides that it's recursing too deeply and gives up.

Press Ctrl+C while the shell is still working its way through the startup files. You'll get a prompt.

Then remove both the inclusion of /etc/bash.bashrc in /etc/profile and the inclusion of /etc/profile in /etc/bash.bashrc. Those files have different roles:

  • /etc/profile is read at login time and does things like setting environment variables. It is often executed by a shell other than bash.
  • /etc/bash.bashrc is a configuration file of bash, only for interactive sessions. It should contain things like aliases and prompts. Bash loads it when you run bash in a terminal.
1

I suggest you to create a live-usb with any distro that you like. Turn on your computer from the liveusb and then mount the partition where is your / something like

mount /dev/sdX /mnt

/mnt would be in your liveISO.

then just edit with nano, vim, or any other text editor your configuration and erase one the those lines.

Then umount your disk and restart the computer, it should work.

  • Or just bootstrap the existing system into rescue mode or emergency mode. – JdeBP Aug 27 '17 at 5:30

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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