Correction du paramètre de chemin dans le fichier ~ / .profile

11

Il y a une ligne dans ~/.profilelaquelle est

PATH="$HOME/bin:$HOME/.local/bin:$PATH"i

Je ne suis pas sûr de la dernière i.

  • Dois-je le retirer ??
  • N'est-ce pas une erreur de syntaxe ??
Sourire
la source
4
@dessert Je ne suis pas sûr que ce soit un doublon. Je suis d'accord que les deux concernent la $PATHvariable d'environnement, mais ce ne sont pas des doublons. Tout au plus, ils sont liés. Cette question est un problème dans ~/.profilelequel il se trouve que c'est juste un caractère supplémentaire dans la ligne où l' $PATHenvironnement est assigné.
Dan
@Dan La réponse la plus élevée (!) Votée dans la question en double explique à quoi devrait ressembler une PATH=ligne ~/.profile- ce qui est la vraie question ici.
dessert
1
@dessert ce que l'OP a ici est parfaitement valide, ce n'est pas un problème de format invalide. Cela fonctionne, cela ne fait rien d'utile.
terdon
2
Oui, j'utilise l'éditeur vi. Peut-être que j'ai accidentellement mis le «i» dans le fichier comme le dit le dessert. Mais alors j'ai dû: wq pour le rendre efficace. Je pense que je ne l'ai pas fait, mais compte tenu de mon niveau, j'aurais peut-être fait quelque chose de stupide.
Souriez

Réponses:

13

Non, ce n'est pas une erreur de syntaxe; c'est juste une lettre qui est ajoutée après l'expansion de $PATH, car le shell supprime les guillemets ...

$ PATH="$HOME/bin:$HOME/.local/bin:$PATH"i
$ echo $PATH
/home/zanna/bin:/home/zanna/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bini

Ainsi, en plus d'ajouter des répertoires locaux, il a effectivement supprimé l'existant /snap/binde mon PATH et ajouté l'inexistant /snap/bini.

Vous pouvez supprimer le ipour réparer votre CHEMIN.

Pour voir le changement, vous devrez vous déconnecter et source ~/.profilevous reconnecter ou exécuter n'importe quel shell que vous utilisez (ou lancer le shell bash -l), car il .profileest lu uniquement par les shells de connexion .

Si vous n'avez pas apporté cette modification à vous- .profilemême, vous souhaiterez peut-être restaurer le fichier par défaut en exécutant

mv ~/.profile{,.old}
cp /etc/skel/.profile ~/.profile

Cela renomme l'ancien .profile .profile.old(vous pouvez également supprimer le fichier si vous le souhaitez) et le remplace par la version par défaut de votre système /etc/skel.

Zanna
la source
5

Je pense que la signification de l'expression suivante n'est pas claire:

PATH="$HOME/bin:$HOME/.local/bin:$PATH"i

La première partie PATH=signifie que nous attribuons une nouvelle valeur à la variable (environnement) $PATH.

La deuxième partie est la nouvelle valeur de cette variable. Dans le cas actuel, la variable $HOMEsera développée avec sa valeur actuelle et à cette valeur sera ajoutée la chaîne /bin:. Il en va de même pour la partie suivante de la chaîne $HOME/.local/bin:. Enfin, la valeur actuelle (précédente) de la $PATHvariable sera développée et ajoutée. Le côlon :joue un rôle de délimiteur dans l' PATHexpression.

L'objectif ultime est d'écrire: PATH=<some additional paths>+<the the current value of $PATH>. Nous plaçons ces chemins supplémentaires devant la chaîne, car nous voulons que le shell recherche d'abord les exécutables dans ces emplacements et ensuite seulement à l'échelle du système.

Le personnage iest inutile. Il sera ajouté à la nouvelle valeur de $PATHet gâchera, comme l'explique @Zanna dans sa réponse .

pa4080
la source
5

Oui, c'est une erreur de syntaxe, le réel .profiledevrait ressembler à ceci sauf si vous avez changé les choses (c'est la version 17.10, voir les notes ci-dessous):

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

Cela peut sembler différent dans les anciennes versions d'Ubuntu où la vérification de la binprésence du répertoire des utilisateurs n'était pas incluse dans le .profile. La meilleure façon de vérifier à quoi cela devrait ressembler est de jeter un coup d'œil /etc/skel/.profile.

Donc, pour ajouter comme vous l'avez demandé dans votre commentaire, placez simplement ceci à la fin de votre fichier de profil:

# Manual addition for swift development snapshot
export PATH="$PATH:/home/jeremy/swift-4.0-DEVELOPMENT-SNAPSHOT-2017-06-29-a-ubuntu16.04/usr/bin"

Si jamais vous gâchez complètement votre profil, il y en a une copie où vous pouvez en obtenir un nouveau /etc/skel/.

Videonauth
la source
1
J'ai une ligne supplémentaire "export PATH = $ PATH: /home/jeremy/swift-4.0-DEVELOPMENT-SNAPSHOT-2017-06-29-a-ubuntu16.04/usr/bin" car je l'ai installée. Est-ce que ça va ??
Sourire
3
Cette ligne est très bien je l'ai incluse dans mon exemple pour montrer où la placer.
Videonauth
1
Veuillez noter que /etc/skel/.profiledans 16.04 semble différent, sans test s'il "$HOME/bin"existe. Même si c'était une meilleure variante (OMI), elle semble avoir été modifiée en 17.10 - pour une raison ou par erreur.
Gunnar Hjalmarsson
@GunnarHjalmarsson le notera dans mon article, et oui, c'est le skel / .profile du 17.10 sur lequel je cours.
Videonauth