$ HOME / dir bin non si trova su $ PATH


11

Nel mio ~/.profileho un ultimo blocco che dovrebbe caricare il mio personale in bin/ directoryquesto modo:

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

Ma a quanto pare non è caricato:

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

Perché questo non funziona? (La mia shell è bash.)

Modifica per 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/"

Per .profileinformazioni generali su questa parte di , vedere askubuntu.com/questions/284640 .
JdeBP,

Quale shell è questa?
njsg,

2
Presumo che la directory esista, giusto?
Batti Bolli il

@njsg è bash

Forse qualcos'altro sta reimpostando la variabile PATH dopo averla eseguita. È possibile verificare utilizzando il -xflag passato a bash e vedere dove viene ripristinato il PERCORSO. Inoltre, è necessario export PATH="$HOME/bin:$PATH"fornirlo ai processi successivi.
Charles Addis,

Risposte:


10

Dall'alto di ~/.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.

Quindi (se stai usando bashcome shell) sto indovinando ~/.bash_profileo ~/.bash_loginè sul tuo sistema. Selezionane uno e modificalo per includere:

export PATH=$PATH:$HOME/bin

Quindi salvare e / source ~/.bash_logino disconnettersi e accedere nuovamente.

Modifica :

Lei dice che sia ~/.bash_profilee ~/.bash_loginsono entrambi mancanti dalla vostra $HOME. Penso che dobbiamo confermare alcune cose. Si prega di pubblicare i risultati di quanto segue nella domanda originale:

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

Modifica 2 :

Personalmente, non so perché ~/.profilenon venga incluso nel tuo caso in base alle informazioni fornite e alla documentazione. Durante il test ho notato che il mio ~/.profileè scansionato quando sshentro ma non quando lancio un nuovo terminale.

Tuttavia, esiste una soluzione semplice per consentire $HOME/bindi essere inclusi nella shell interattiva. Modifica (crea se non presente) ~/.bashrce aggiungi la seguente riga:

export PATH=$PATH:$HOME/bin

Salvare, disconnettersi e riconnettersi o source ~/.bashrc.

La exportlinea potrebbe essere espansa per verificare che $HOME/binesista se ti piace con:

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

Perché ~/.bashrcinvece di un altro file? Preferenza personale e sembra essere anche più affidabile.


Sebbene, poiché l'interrogante non ha specificato quale shell, esiste anche la possibilità che non si stia utilizzando affatto la shell Bourne Again. Certamente altre persone con questa stessa domanda potrebbero non esserlo.
JdeBP,

@JdeBP: aggiunto chiarimento per rispondere. Presumendo come utente Debian non avevano cambiato la loro shell interattiva predefinita, ma immagino che avrebbero potuto.
Tigger,

Non ho nessuno dei ~/.bash_profile~/.bash_login. Al mio ~ci sono solo .bash_historye .bash_logout(e ovviamente il .profile).

@Tigger aggiornato!

@student: fatto un altro aggiornamento. Davvero in perdita per quello che sta succedendo. Abbastanza interessato a sapere se scopri perché ~/.profileviene saltato.
Tigro

6

Le regole per i file di avvio della shell in-sourcing sono complesse . È probabile che con la tua configurazione .profilenon venga incluso quando apri un nuovo terminale all'interno di una sessione X (prova a metterne uno echo .profiledentro .profilee vedi se il messaggio appare quando avvii una shell).

.  "$HOME/.profile"

dovrebbe ricaricare il profilo manualmente.

Anche l'accesso e la disconnessione da X dovrebbero causare il .profilecaricamento.

In alternativa, puoi farlo . $HOME/.profileda .bashrc(mentre usi una protezione basata su variabili per evitare la doppia inclusione) per assicurarti che .profilesia sempre incluso ogni volta che avvii una shell.

(Non dovresti aver bisogno di export PATHcome PATHè già una variabile esportata e modificando il suo valore non cambierà il suo exportstato.)


sourcing .profile da .bashrc! nella maggior parte dei casi .profile contiene `. .bashrc`, questo non passerà attraverso un ciclo infinito ?!
Giona,

@youness Sto facendo entrambe le cose e sto usando include guards ( [ -z "$has___profile" ] || return; has__profile=1) quindi non ottengo loop infiniti ed entrambi .profilee .bashrc(solo se è definito BASH_VERSION), non importa come ci sono arrivato.
PSkocik,

capito ! il mio cattivo inglese mi ha spinto a porre questa domanda non richiesta (mettere il codice per una spiegazione è meglio dell'espressione letterale). grazie per il tuo tempo :-)
Giona il

bash -lVerrà caricato un semplice .profile(a meno che una configurazione dispari). Inoltre, il PERCORSO dovrebbe essere impostato correttamente quando l'utente accede. Ciò significa che nel "display manager" (dm) in uso: gnome, KDE, xfce, lxde, ecc.
Isaac,

1

Se vuoi essere .profilecaricato, tutto ciò che serve è avviare una shell di accesso:

$ bash -l

Questo dovrebbe essere sufficiente per una sessione in esecuzione. È possibile confrontare il PERCORSO prima e dopo l'avvio di un login bash per confermare la differenza.

Per una soluzione più permanente è necessario che una shell di login venga avviata ad un certo punto prima dell'avvio del terminale (console). L'accesso come utente specifico avviene su alcuni dm (display manager) (gnome, kde, xfce, lxde, ecc.). Dovrebbe essere compito di ognuno di loro cambiare la variabile d'ambiente PATH in base alle proprie esigenze.

Ad esempio, per xfce, la soluzione è cambiare 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"

Per gnome, sembra che il file da cambiare sia ~/.pam_environment.

E per KDE, segui questa guida , per creare il file, puoi usare questo codice:

$ file='$HOME/.config/plasma-workspace/env/path.sh'
$ code='export PATH=$HOME/bin:$PATH'
$ echo "$code" >> "$file"
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.