O diretório $ HOME / bin não está no $ PATH

11

No meu ~/.profileeu tenho um último bloco que deve carregar meu pessoal bin/ directorycomo este:

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

Mas aparentemente não está carregado:

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

Por que isto não está funcionando? (Meu shell é 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
fonte
Para obter informações detalhadas sobre essa parte .profile, consulte askubuntu.com/questions/284640 .
23717 JdeBP
Que concha é essa?
Njsg 23/07/19
2
Presumo que o diretório exista, certo?
Beat Bolli
@njsg it is bash
Possivelmente outra coisa está redefinindo sua variável PATH após a execução. Você pode verificar usando o -xsinalizador passado para o bash e vendo onde o PATH é redefinido. Além disso, você precisa export PATH="$HOME/bin:$PATH"fornecê-lo aos processos subseqüentes.
Charles Addis

Respostas:

10

Do topo 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.

Então (se você estiver usando bashcomo seu shell), acho que está ~/.bash_profileou ~/.bash_loginestá no seu sistema. Selecione um e edite-o para incluir:

export PATH=$PATH:$HOME/bin

Em seguida, salve e source ~/.bash_loginou efetue logout e logon novamente.

Editar :

Você diz que ambos ~/.bash_profilee ~/.bash_loginestão ausentes do seu $HOME. Acho que precisamos confirmar algumas coisas. Poste os resultados a seguir na sua pergunta original:

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

Edição 2 :

Pessoalmente, não sei por que ~/.profilenão está sendo incluído no seu caso com base nas informações e documentação fornecidas. Durante o teste, notei que o meu ~/.profileé digitalizado quando entro ssh, mas não quando inicio um novo terminal.

Porém, existe uma solução simples para permitir $HOME/bina inclusão no seu shell interativo. Edite (crie se não estiver presente) ~/.bashrce adicione a seguinte linha:

export PATH=$PATH:$HOME/bin

Salve, efetue logout e efetue login novamente, ou source ~/.bashrc.

A exportlinha pode ser expandida para verificar $HOME/binse existe, se você gostar de:

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

Por que ao ~/.bashrcinvés de outro arquivo? Preferência pessoal e também parece ser mais confiável.

Tigre
fonte
Embora, como o questionador não tenha especificado qual shell, também há a possibilidade de que um não esteja usando o shell Bourne Again. Certamente outras pessoas com essa mesma pergunta podem não estar.
23417 JdeBP
@JdeBP: adicionado esclarecimento para responder. Supondo que, como usuário do Debian, eles não haviam alterado seu shell interativo padrão, mas acho que eles poderiam ter.
Tigger
Eu não tenho nenhum dos ~/.bash_profilenem ~/.bash_login. No meu ~há apenas .bash_historye .bash_logout(e, claro, o .profile).
@Tigger updated!
@ aluno: fez outra atualização. Realmente sem saber o que está acontecendo. Muito interessado em saber se você descobrir por que ~/.profileestá sendo ignorado.
Tigger
6

As regras para arquivos de inicialização do shell de origem são complexas . É provável que, com sua configuração, .profilenão esteja sendo incluído quando você abre um novo terminal dentro de uma sessão X (tente colocar um echo .profileinterior .profilee veja se a mensagem aparece quando você inicia um shell).

.  "$HOME/.profile"

deve recarregar o perfil manualmente.

Fazer login e sair do X também deve causar o .profilecarregamento.

Como alternativa, você pode fazer a . $HOME/.profilepartir de .bashrc(enquanto estiver usando uma proteção baseada em variável para evitar a inclusão dupla) para garantir que .profilesempre esteja incluída sempre que você iniciar um shell.

(Você não precisa, export PATHpois PATHjá é uma variável exportada e a modificação de seu valor não alterará seu exportstatus.)

PSkocik
fonte
sourcing .profile de .bashrc! na maioria dos casos .profile contém `. .bashrc`, isso não ocorre através de um loop infinito ?!
Jonah
@ youness Estou fazendo as duas coisas e estou usando include guardas ( [ -z "$has___profile" ] || return; has__profile=1), então não recebo loops infinitos e ambas .profilee .bashrc(apenas se BASH_VERSION estiver definido), não importa como cheguei lá.
PSKocik
deixa comigo ! meu inglês ruim me levou a fazer essa pergunta desnecessária (colocar código para explicação é melhor do que expressão literal). obrigado pelo seu tempo :-)
Jonah
Um simples bash -lserá carregado .profile(a menos que haja alguma configuração estranha). Além disso, o caminho deve ser definido corretamente quando o usuário faz login Isso significa que no "display manager" (DM) em uso: Gnome, KDE, Xfce, LXDE, etc..
Isaac
1

Se você deseja ser .profilecarregado, basta iniciar um shell de login:

$ bash -l

Isso deve ser suficiente para uma sessão em execução. Você pode comparar o PATH antes e depois de iniciar o bash de login para confirmar a diferença.

Para uma solução mais permanente, é necessário que um shell de login seja iniciado em algum momento antes do início do seu terminal (console). O login como um usuário específico acontece em alguns dm (gerenciadores de exibição) (gnome, kde, xfce, lxde, etc). Qualquer um deles deve ser o trabalho de alterar a variável de ambiente PATH para atender às suas necessidades.

Por exemplo, para xfce, a solução é mudar 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 o gnome, parece que o arquivo a ser alterado é ~/.pam_environment.

E para o KDE, siga este guia , para criar o arquivo, você pode usar este código:

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