$ HOME / bin dir n'est pas sur le $ PATH

11

Dans mon ~/.profilej'ai un dernier bloc qui devrait charger mon personnel bin/ directorycomme ceci:

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

Mais il n'est apparemment pas chargé:

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

Pourquoi ça ne marche pas? (Ma coquille est bash.)

Modifier pour Tigrou

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
la source
Pour plus d'informations sur cette partie de .profile, consultez askubuntu.com/questions/284640 .
JdeBP
De quelle coquille s'agit-il?
njsg
2
Je suppose que le répertoire existe, non?
Beat Bolli
@njsg c'est bash
Il est possible que quelque chose d'autre réinitialise votre variable PATH après son exécution. Vous pouvez vérifier en utilisant l' -xindicateur passé à bash et en voyant où le CHEMIN est réinitialisé. Vous devez également le export PATH="$HOME/bin:$PATH"fournir aux processus ultérieurs.
Charles Addis

Réponses:

10

Du haut 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.

Donc (si vous utilisez bashcomme shell) Je devine que ce soit ~/.bash_profileou ~/.bash_loginest sur votre système. Sélectionnez-en un et modifiez-le pour inclure:

export PATH=$PATH:$HOME/bin

Ensuite, enregistrez et / source ~/.bash_loginou déconnectez-vous et reconnectez-vous.

Modifier :

Vous dites que les deux ~/.bash_profileet que vous manquez tous ~/.bash_loginles deux $HOME. Je pense que nous devons confirmer certaines choses. Veuillez publier les résultats suivants dans votre question d'origine:

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

Modifier 2 :

Personnellement, je ne sais pas pourquoi ~/.profilen'est pas inclus dans votre cas sur la base des informations fournies et de la documentation. Lors des tests, j'ai remarqué que mon analyse était effectuée à mon ~/.profilearrivée, sshmais pas au lancement d'un nouveau terminal.

Mais, il existe une solution simple pour permettre $HOME/bind'être inclus dans votre shell interactif. Modifiez (créez s'il n'est pas présent) ~/.bashrcet ajoutez-y la ligne suivante:

export PATH=$PATH:$HOME/bin

Enregistrez, déconnectez-vous et reconnectez-vous, ou source ~/.bashrc.

La exportligne pourrait être étendue pour vérifier qu'elle $HOME/binexiste si vous aimez avec:

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

Pourquoi ~/.bashrcau lieu d'un autre fichier? Préférence personnelle et semble être plus fiable aussi.

Tigrou
la source
Bien que, puisque l'interrogateur n'a pas spécifié quel shell, il est également possible que l'on n'utilise pas du tout le shell Bourne Again. Certes, d'autres personnes ayant cette même question pourraient ne pas l'être.
JdeBP
@JdeBP: ajout d'une clarification pour répondre. En supposant en tant qu'utilisateur Debian, ils n'avaient pas changé leur shell interactif par défaut, mais je suppose qu'ils auraient pu.
Tigger
Je n'ai pas de ~/.bash_profileni ~/.bash_login. Chez moi ~il n'y a que .bash_historyet .bash_logout(et bien sûr les .profile).
@Tigger mis à jour!
@student: fait une autre mise à jour. Vraiment à court de ce qui se passe. Très intéressé d'entendre si vous découvrez pourquoi ~/.profileest ignoré.
Tigger
6

Les règles pour l'internalisation des fichiers de démarrage du shell sont complexes . Il est probable qu'avec votre configuration, .profilene soit pas inclus lorsque vous ouvrez un nouveau terminal dans une session X (essayez de mettre un echo .profileintérieur de .profileet voyez si le message apparaît lorsque vous démarrez un shell).

.  "$HOME/.profile"

devrait recharger le profil manuellement.

La connexion et la déconnexion de X devraient également entraîner un .profilechargement.

Alternativement, vous pouvez faire . $HOME/.profiledepuis .bashrc(tout en utilisant un garde basé sur des variables pour empêcher la double inclusion) pour vous assurer qu'il .profileest toujours inclus chaque fois que vous démarrez un shell.

(Vous ne devriez pas avoir besoin de le faire export PATHcar il PATHs'agit déjà d'une variable exportée et la modification de sa valeur ne changera pas son exportétat.)

PSkocik
la source
sourcing .profile depuis .bashrc! dans la plupart des cas .profile contient `. .bashrc`, cela ne passera pas par une boucle infinie?!
Jonah
@youness je fais les deux et j'utilise include guards ( [ -z "$has___profile" ] || return; has__profile=1) donc je n'ai pas de boucles infinies et les deux .profileet .bashrc(seulement si BASH_VERSION est défini) peu importe comment j'y suis arrivé.
PSkocik
J? ai compris ! mon mauvais anglais m'a poussé à poser cette question inédite, (mettre du code pour l'explication est mieux que l'expression littérale). merci pour votre temps :-)
Jonah
Un simple bash -lse chargera .profile(à moins d'une configuration étrange). En outre, le CHEMIN doit être correctement défini lorsque l'utilisateur se connecte. Cela signifie que dans le "gestionnaire d'affichage" (dm) utilisé: gnome, KDE, xfce, lxde, etc.
Isaac
1

Si vous voulez être .profilechargé, il vous suffit de démarrer un shell de connexion:

$ bash -l

Cela devrait suffire pour une session en cours. Vous pouvez comparer le CHEMIN avant et après le démarrage d'une session de connexion pour confirmer la différence.

Pour une solution plus permanente, vous devez démarrer un shell de connexion à un moment donné avant le démarrage de votre terminal (console). La connexion en tant qu'utilisateur spécifique se produit sur certains dm (gestionnaire d'affichage) (gnome, kde, xfce, lxde, etc.). Il devrait incomber à chacun d'entre eux de modifier la variable d'environnement PATH pour qu'elle corresponde à vos besoins.

Par exemple, pour xfce, la solution est de changer 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"

Pour gnome, il semble que le fichier à modifier soit ~/.pam_environment.

Et pour KDE, suivez ce guide , pour créer le fichier, vous pouvez utiliser ce code:

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