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
Deja una respuesta