$ HOME / bin dir no está en el $ PATH

11

En mi ~/.profiletengo un último bloque que debería cargar mi personal bin/ directoryasí:

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

Pero aparentemente no está cargado:

echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

¿Por qué esto no funciona? (Mi caparazón es bash)

Editar para Tigger

echo $0 => bash

echo $HOME => /home/student

whoami => student

less /etc/*-release => 
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
Chris Tang
fuente
Para obtener más información sobre esta parte .profile, consulte askubuntu.com/questions/284640 .
JdeBP
¿Qué caparazón es este?
njsg
2
Supongo que el directorio existe, ¿verdad?
Derrota a Bolli el
@njsg es bash
Posiblemente, algo más está restableciendo su variable PATH después de ejecutar esto. Puede verificar usando la -xbandera pasada a bash y ver dónde se restablece la RUTA. Además, debe export PATH="$HOME/bin:$PATH"proporcionarlo a los procesos posteriores.
Charles Addis

Respuestas:

10

Desde la parte superior de ~/.profile:

# ~/.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.

Entonces (si lo está utilizando bashcomo shell), supongo que ~/.bash_profileo ~/.bash_loginestá en su sistema. Seleccione uno y edítelo para incluir:

export PATH=$PATH:$HOME/bin

Luego guarde source ~/.bash_logino cierre sesión y vuelva a iniciar sesión.

Editar :

Dices eso ~/.bash_profiley ~/.bash_loginambos faltan en tu $HOME. Creo que necesitamos confirmar algunas cosas. Publique los resultados de lo siguiente en su pregunta original:

echo $0
echo $HOME
whoami
less /etc/*-release

Edición 2 :

Personalmente, no sé por qué ~/.profileno se incluye en su caso en función de la información proporcionada y la documentación. Durante las pruebas, noté que mi ~/.profileescaneo se realiza cuando entro, sshpero no cuando inicio un nuevo terminal.

Pero, hay una solución simple para permitir $HOME/binque se incluya en su shell interactivo. Edite (cree si no está presente) ~/.bashrcy agregue la siguiente línea:

export PATH=$PATH:$HOME/bin

Guardar, cerrar sesión y volver a iniciar sesión, o source ~/.bashrc.

La exportlínea podría expandirse para verificar $HOME/binsi existe si lo desea con:

if [ -d "$HOME/bin" ]
then
    export PATH=$PATH:$HOME/bin
fi

¿Por qué en ~/.bashrclugar de otro archivo? Preferencia personal y parece ser más confiable también.

Tigger
fuente
Aunque, dado que el interlocutor no especificó qué shell, también existe la posibilidad de que uno no esté utilizando el shell Bourne Again. Ciertamente, otras personas con esta misma pregunta podrían no estarlo.
JdeBP
@JdeBP: aclaración agregada para responder. Suponiendo que como usuario de Debian no habían cambiado su shell interactivo predeterminado, pero supongo que podrían haberlo hecho.
Tigger
No tengo ninguno de los ~/.bash_profilenor ~/.bash_login. En mi ~solo hay .bash_historyy .bash_logout(y por supuesto el .profile).
¡@Tigger actualizado!
@student: hizo otra actualización. Realmente perdido en cuanto a lo que está sucediendo. Bastante interesado en saber si descubres por qué ~/.profilese omite.
Tigger
6

Las reglas para los archivos de inicio de shell de abastecimiento son complejas . Es probable que con su configuración, .profileno se incluya cuando abra un nuevo terminal dentro de una sesión X (intente poner un echo .profileinterior .profiley ver si el mensaje aparece cuando inicia un shell).

.  "$HOME/.profile"

debería recargar el perfil manualmente.

Iniciar y cerrar sesión en X también debería hacer .profileque se cargue.

Alternativamente, puede hacerlo . $HOME/.profiledesde .bashrc(mientras usa un protector basado en variables para evitar la doble inclusión) para asegurarse de que .profilesiempre se incluya cada vez que inicie un shell.

(No debería necesitarlo, export PATHya que PATHes una variable exportada y modificar su valor no cambiará su exportestado).

PSkocik
fuente
abastecimiento .perfil de .bashrc! en la mayoría de los casos .profile contiene `. .bashrc`, ¿esto no pasará por un bucle infinito?
Jonás
@youness Estoy haciendo ambas cosas y estoy usando incluir guardias ( [ -z "$has___profile" ] || return; has__profile=1), así que no obtengo bucles infinitos y ambas .profiley .bashrc(solo si se define BASH_VERSION) sin importar cómo llegué allí.
PSkocik
Lo tengo ! mi mal inglés me empujó a hacer esta pregunta innecesaria (poner código para la explicación es mejor que la expresión literal). gracias por su tiempo :-)
Jonás
Se bash -lcargará un simple .profile(a menos que haya alguna configuración extraña). Además, la RUTA debe establecerse correctamente cuando el usuario inicia sesión. Eso significa que en el "administrador de pantalla" (dm) en uso: gnome, KDE, xfce, lxde, etc.
Isaac
1

Si desea .profilecargarse, todo lo que necesita es iniciar un shell de inicio de sesión:

$ bash -l

Eso debería ser suficiente para una sesión en ejecución. Puede comparar la RUTA antes y después de que se haya iniciado una sesión de inicio de sesión para confirmar la diferencia.

Para una solución más permanente, necesita que se inicie un shell de inicio de sesión en algún momento antes de que se inicie su terminal (consola). El inicio de sesión como usuario específico ocurre en algunos dm (administrador de pantalla) (gnome, kde, xfce, lxde, etc.). Debería ser el trabajo de cualquiera de ellos cambiar la variable de entorno PATH para que coincida con sus necesidades.

Por ejemplo, para xfce, la solución es cambiar xinitrc:

$ cat >"$HOME/.config/xfce4/xinitrc" <<-\_EOT_
#!/bin/sh

# Ensure programs in ~/bin are available for the X session.
p="$HOME/bin";
[ "$p" != "${PATH%%:*}" ] && export PATH=$p:$PATH
_EOT_
cat "/etc/xdg/xfce4/xinitrc" | tail -n+2 >> "$HOME/.config/xfce4/xinitrc"

Para gnome, parece que el archivo a cambiar es ~/.pam_environment.

Y para KDE, siga esta guía , para crear el archivo, puede usar este código:

$ file='$HOME/.config/plasma-workspace/env/path.sh'
$ code='export PATH=$HOME/bin:$PATH'
$ echo "$code" >> "$file"
Isaac
fuente