Correzione dell'impostazione del percorso nel file ~ / .profile


11

C'è una linea in ~/.profilecui è

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

Non sono sicuro dell'ultimo i.

  • Devo rimuoverlo ??
  • Non è un errore di sintassi ??


4
@dessert Non sono sicuro che sia un duplicato. Sono d'accordo che entrambi riguardano la $PATHvariabile d'ambiente, ma non sono affatto duplicati. Al massimo, sono correlati. Questa domanda è un problema in ~/.profilecui sembra essere un carattere in più nella riga in cui $PATHè assegnato l' ambiente.
Dan,

@Dan La risposta più votata (!) Nella domanda duplicata spiega come dovrebbe apparire valida una PATH=linea ~/.profile- che è la vera domanda qui.
dessert

1
@dessert ciò che l'OP ha qui è perfettamente valido, non è un problema di un formato non valido. Funziona, semplicemente non fa nulla di utile.
Terdon,

2
Sì, utilizzo l'editor vi. Forse ho accidentalmente messo la 'i' nel file come diceva dessert. Ma poi ho dovuto: wq per renderlo efficace. Penso di non averlo fatto, ma considerando il mio livello avrei potuto fare qualcosa di stupido.
Sorridi il

Risposte:


13

No, non è un errore di sintassi; è solo una lettera che viene aggiunta dopo l'espansione di $PATH, perché la shell rimuove le virgolette ...

$ 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

Quindi, oltre a anteporre directory locali, ha effettivamente rimosso l'esistente /snap/bindal mio PERCORSO e aggiunto l'inesistente /snap/bini.

È possibile rimuovere il iper riparare il PERCORSO.

Per vedere la modifica, dovrai disconnetterti e riconnetterti o eseguirlo source ~/.profilein qualsiasi shell che stai utilizzando (o avviare la shell con bash -l), poiché .profileviene letto solo dalle shell di accesso .

Se non hai apportato questa modifica a te .profilestesso, potresti voler ripristinare il file predefinito eseguendolo

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

Questo rinomina il vecchio .profile .profile.old(potresti anche eliminare il file se lo desideri) e lo sostituisce con la versione predefinita per il tuo sistema /etc/skel.


5

Penso che qui non sia chiaro cosa significhi la seguente espressione:

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

La prima parte PATH=significa che assegniamo un nuovo valore alla variabile (ambiente) $PATH.

La seconda parte è il nuovo valore di quella variabile. Nel caso attuale la variabile $HOMEverrà espansa con il suo valore corrente e a quel valore verrà aggiunta la stringa /bin:. Lo stesso vale per la parte successiva della stringa $HOME/.local/bin:. Infine, il valore corrente (precedente) della $PATHvariabile verrà espanso e aggiunto. I due punti :svolgono un ruolo di delimitatore PATHnell'espressione.

L'obiettivo è in ultima analisi, a scrivere: PATH=<some additional paths>+<the the current value of $PATH>. Mettiamo questi percorsi aggiuntivi davanti alla stringa, perché vogliamo che la shell cerchi prima gli eseguibili in queste posizioni e solo successivamente a livello di sistema.

Il personaggio inon è necessario. Verrà aggiunto al nuovo valore di $PATHe farà un casino, come spiega @Zanna nella sua risposta .


5

Sì, è un errore di sintassi, l'attuale .profiledovrebbe apparire come questo a meno che tu non abbia cambiato le cose (questa è la versione 17.10, vedi le note sotto di essa):

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

Questo potrebbe apparire diverso nelle versioni precedenti di Ubuntu in cui il controllo se la bindirectory degli utenti è presente non è stato incluso in .profile. Il modo più semplice per controllare come dovrebbe essere è dare un'occhiata /etc/skel/.profile.

Quindi, per aggiungere come hai chiesto nel tuo commento, posizionalo alla fine del file del tuo profilo:

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

Se hai mai incasinato completamente il tuo profilo, c'è una copia in cui puoi ottenerne uno nuovo /etc/skel/.


1
Ho una riga extra "export PATH = $ PATH: /home/jeremy/swift-4.0-DEVELOPMENT-SNAPSHOT-2017-06-29-a-ubuntu16.04/usr/bin" perché l'ho installato. Va bene??
Sorridi il

3
Questa linea va bene l'ho inclusa nel mio esempio per mostrare dove posizionarla.
Videonauth,

1
Si noti che /etc/skel/.profilein 16.04 sembra diverso, senza un test se "$HOME/bin"esiste. Anche se quella era una variante migliore (IMO), sembra essere stata cambiata nel 17.10 - per una ragione o per errore.
Gunnar Hjalmarsson,

@GunnarHjalmarsson noterà che nel mio post, e sì, questo è lo skel / .profile dalle 17.10 a cui sto correndo.
Videonauth,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.