shell interactivas y shell con login

Algunos de los conceptos de linux con complicados de entender, incluso años después de serguir usando GNU/Linux sigo aprendiendo cosas muy básicas.

Voy a intentar explicar(me) qué es una shell interactiva y una shell con login, y qué suecede cuando entras en cada una de ellas

shell login

Cuando tienes que introducir usuario y password para acceder, ya sea terminal, ssh, etc…

A login shell is one whose first character of argument zero is a -, or one started with the –login option.

man 1 bash

lo importante de aquí es ver que se ejecutan esta secuencia de ficheros para configurar el entorno de usuairo:

/etc/profile, 
~/.bash_profile
~/.bash_login
~/.profile

A destacar sólo .profile ya que busca si tenemos un bin propio para el usuario y lo mete en el PATH

shell interactiva

Una shell que abres una vez que ya estás en el sistema, por ejemplo cuando abres un xterm o un mate terminal

An interactive shell is one started without non-option arguments (unless -s is specified) and without the -c option whose standard input and error are both connected to terminals (as determined by isatty(3)), or one started with the -i option. PS1 is set and $- includes i if bash is interactive, allowing a shell script or a startup file to test this state.

man 1 bash

El problema que tengo actualmente es que esta shell interactiva no está ejecutando ~/.profile y no sé por qué, por que si debería según la documentación [WIP]

When an interactive shell that is not a login shell is started, bash reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if these files exist. This may be inhibited by using the –norc option. The –rcfile file option will force bash to read and execute commands from file instead of /etc/bash.bashrc and ~/.bashrc.

man 1 bash

En resumen, todo este hilo es por que necesitaba tener de alguna forma cómoda y elegante un PATH a ~/.local/bin y finalmente lo que voy a hacer es agregar este código a ~/.bashrc

# add at the bottom of ~/.bashrc
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

#/etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "$(id -u)" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH

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

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
	. "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

Publicado

en

por

Etiquetas:

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.