Corrigindo a configuração do caminho no arquivo ~ / .profile

11

Há uma linha na ~/.profilequal é

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

Não tenho certeza sobre o último i.

  • Devo removê-lo?
  • Não é um erro de sintaxe?
Sorrir
fonte
4
@dessert Não tenho certeza se é uma duplicata. Concordo que ambos são sobre a $PATHvariável de ambiente, mas não são duplicatas. No máximo, eles estão relacionados. Essa questão é um problema no ~/.profilequal, por acaso, é um caractere extra na linha em que o $PATHambiente está atribuído.
Dan
@ Dan A resposta mais votada (!) Na pergunta duplicada explica como uma PATH=linha ~/.profiledeve parecer válida - qual é a verdadeira pergunta aqui.
sobremesa
1
@dessert o que o OP tem aqui é perfeitamente válido, não é um problema de formato inválido. Isso funciona, simplesmente não faz nada de útil.
terdon
2
Sim, eu uso o vi editor. Possivelmente, coloquei acidentalmente o 'i' no arquivo, como dizia a sobremesa. Mas então eu tive que: wq para torná-lo eficaz. Eu acho que não fiz isso, mas considerando o meu nível, eu poderia ter feito algo estúpido.
Sorriso

Respostas:

13

Não, não é um erro de sintaxe; é apenas uma letra que é anexada após a expansão de $PATH, porque o shell remove aspas ...

$ 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

Assim, além de anexar diretórios locais, ele efetivamente removeu o existente /snap/bindo meu PATH e adicionou o inexistente /snap/bini.

Você pode remover o ipara reparar seu PATH.

Para ver a alteração, você precisará efetuar logout e logon novamente ou executar source ~/.profileem qualquer shell que estiver usando (ou iniciar o shell bash -l), porque isso .profileé lido apenas pelos shells de login .

Se você não fez essa alteração por conta .profileprópria, convém restaurar o arquivo padrão executando

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

Isso renomeia o antigo .profile .profile.old(você também pode excluir o arquivo, se desejar) e o substitui pela versão padrão para o seu sistema /etc/skel.

Zanna
fonte
5

Acho que aqui não está claro o que significa a seguinte expressão:

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

A primeira parte PATH=significa que atribuímos um novo valor à variável (ambiente) $PATH.

A segunda parte é o novo valor dessa variável. No caso atual, a variável $HOMEserá expandida com seu valor atual e a esse valor será anexada a string /bin:. O mesmo vale para a próxima parte da string $HOME/.local/bin:. Finalmente, o valor atual (anterior) da $PATHvariável será expandido e anexado. O cólon :desempenha um papel de delimitador na PATHexpressão.

O objetivo é, em última análise a escrever: PATH=<some additional paths>+<the the current value of $PATH>. Colocamos esses caminhos adicionais na frente da string, porque queremos que o shell procure executáveis ​​primeiro nesses locais e somente depois em todo o sistema.

O personagem ié desnecessário. Ele será anexado ao novo valor de $PATHe fará uma bagunça, como @Zanna explica em sua resposta .

pa4080
fonte
5

Sim, é um erro de sintaxe, o real .profiledeve ficar assim, a menos que você tenha mudado as coisas (esta é a versão 17.10, veja as notas abaixo):

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

Isso pode parecer diferente nas versões mais antigas do Ubuntu, onde a verificação se o bindiretório de usuários está presente não foi incluída no .profile. A maneira mais fácil de verificar como deve ser é dar uma olhada /etc/skel/.profile.

Então, para adicionar como você pediu no seu comentário, basta colocá-lo no final do seu arquivo de perfil:

# 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 você estragar completamente o seu perfil, há uma cópia na qual você pode obter um novo /etc/skel/.

Videonauth
fonte
1
Eu tenho uma linha extra "export PATH = $ PATH: /home/jeremy/swift-4.0-DEVELOPMENT-SNAPSHOT-2017-06-29-a-ubuntu16.04/usr/bin" porque eu o instalei. Está bom??
Sorriso
3
Esta linha é boa, eu a incluí no meu exemplo para mostrar onde colocá-la.
Videonauth
1
Observe que /etc/skel/.profileno 16.04 parece diferente, sem um teste, se "$HOME/bin"existe. Mesmo que essa fosse uma variante melhor (IMO), parece ter sido alterada em 17.10 - por uma razão ou por engano.
Gunnar Hjalmarsson
@GunnarHjalmarsson observará que no meu post, e sim, este é o skel / .profile das 17.10 em que estou executando.
Videonauth