Como defino uma variável de ambiente do usuário? (permanentemente, não sessão)

145

Isso está me irritando. Eu vi várias sugestões (todas usando arquivos e sintaxe diferentes) e nenhuma delas funcionou.

Como faço para definir uma variável de ambiente para um usuário específico? Estou no debian squeeze. Qual é a sintaxe exata que devo colocar no arquivo para criar ABC = "123"?

Gilles
fonte
7
O que você já tentou?
L0b0 28/09/11
11
editando .bashrc, .bash_profile, .profile e .ssh / eviroment. Embora eu não sei se eu escrevi-o no local certo ou teve a sintaxe correta de cada vez
4
.bashrcé o principal lugar para isso.
rozcietrzewiacz 28/09/11
@rozcietrzewiacz: ok, mas ... mesmo depois de ter a solução, tentei configurar o ABC1 e o ABC2 no início e no final desse arquivo e ele não está definido no meu ambiente.
11
Verifique se .bash_profilecontém algo parecido [[ -f ~/.bashrc ]] && . ~/.bashrc.
rozcietrzewiacz

Respostas:

113

Você precisa colocar a declaração nos arquivos de inicialização do seu shell:

  • Se você estiver usando bash, ash, ksh ou algum outro shell no estilo Bourne, poderá adicionar

    ABC="123"; export ABC
    

    no seu .profilearquivo ( ${HOME}/.profile). Esta é a situação padrão na maioria das instalações Unix, e em particular no Debian.

    Se o seu shell de login for bash, você pode usar .bash_profile( ${HOME}/.bash_profile) ou .bash_loginentão.

    Nota: Se um desses arquivos existir e seu shell de logon for bash, ele .profilenão será lido quando você efetuar logon no ssh ou em um console de texto, mas ainda poderá ser lido em vez de .bash_profilese você efetuar login na GUI. Além disso, se não houver .bash_profile, use .bashrc.

  • Se você definiu o zsh como seu shell de login, use em ~/.zprofilevez de ~/.profile.

  • Se você estiver usando o tcsh, adicione

    setenv ABC "123"
    

    no .loginarquivo ( ${HOME}/.login)

  • se você estiver usando outro shell, consulte o manual do shell como definir variáveis ​​de ambiente e quais arquivos são executados na inicialização do shell.

Matteo
fonte
5
O comportamento padrão de su useré alterar a propriedade do shell atual para o nome do usuário arg, mantendo o diretório inicial e o ambiente do usuário que está chamando. Para entrar no shell de forma a se tornar o novo usuário e obter todas as suas configurações ambientais ($ PATH, $ HOME, $ ABC, etc), você precisa passar um - como o primeiro argumento a su. su - usernamerealizará o que você está pedindo.
Tim Kennedy
11
Espere: o que você quer dizer com "saiu para o root"? De qualquer forma, criar um 'su' não inicializa o shell. Você precisa de 'su -' (ver man su)
Matteo
11
Por que você entrou suem primeiro lugar? Você não acabou de criar uma propriedade de raiz .profileque não pode ser usada pelo usuário?
rozcietrzewiacz 28/09/11
11
@ acid é o que deveria ter sido feito. A questão é: o que é originário quando você faz login. Para verificar isso, faça logout primeiro.
rozcietrzewiacz 28/09/11
7
Como .profileé lido por todos os shells compatíveis com Bourne, você não deve escrever a sintaxe do Bash nesse arquivo. Em particular, export VARIABLE=valueprecisa ser refatorado para VARIABLE=value; export VARIABLE.
tripleee
48

Use o /etc/environmentarquivo para definir as variáveis ​​de ambiente. Em seguida, adicione a seguinte linha dentro do /etc/environmentarquivo.

ABC="123"

Agora a variável ABC estará acessível em todas as sessões do usuário. Para testar a saída da variável, atualize primeiro a variável de ambiente usando o comando

source /etc/environment

e corra echo $ABC.

Hokam
fonte
4
+1 para o comando de origem. Que estava faltando em todas as respostas
Nerrve
5
Tenha cuidado para /etc/environmentnão suportar a sintaxe completa do bash, algo que eu descobri da maneira mais difícil. Por exemplo, colocar PATH="/usr/bin:/usr/sbin"e fazer PATH="$PATH:/foo/bar"na linha a seguir não funcionará #
user2428118
Não tenho certeza se isso é um problema pessoal ou o quê, mas tive que reiniciar meu sistema operacional depois de configurá-lo /etc/environment, mesmo se eu reiniciei o terminal bash ou digitei source /etc/environment. Portanto, se você estiver tendo problemas em que a variável de ambiente não está se perpetuando, tente reiniciar.
precisa saber é o seguinte
9

Este é um procedimento geral que você pode usar para praticamente qualquer shell. De qualquer forma, você precisa saber em qual shell o usuário normalmente efetuaria login:

path="$(grep $USER /etc/passwd | cut -d ':' -f 7)"
shell="$(basename -- "$path")"

Então você precisa descobrir quais arquivos de ponto esse shell normalmente lê:

man $shell

Um atalho que pode funcionar é listar os arquivos de ponto que contêm o nome do shell:

ls ~/.*${shell}*

Se você deseja verificar se um dos arquivos é realmente lido durante o login, basta imprimir o nome do arquivo em cada um deles, por exemplo:

echo .bashrc

Ao fazer login, você deve ver quais arquivos estão sendo lidos e pode decidir qual deles modificar. Cuidado para não tentar usar algo echo "$0"semelhante, pois o valor de $0depende de como o shell processa arquivos de ponto e pode ser enganoso.

Quando se trata de declarar a variável "permanentemente", observe que isso se estende apenas à sessão. Não há como acessar o valor de uma variável sem uma sessão, portanto, ela não tem significado fora de uma. Se você quer dizer "somente leitura", isso depende do shell e no Bash você pode usar:

declare -r VAR

se já tiver um valor, ou

declare -r VAR=value

atribuí-lo ao mesmo tempo. Nem todas as conchas têm esse recurso.

Para declarar uma variável na maioria dos shells, use um nome de variável ( [A-Za-z_][A-Za-z0-9_]*), seguido por um sinal de igual (e sem espaços ao redor do sinal de igual), depois um valor (de preferência citado, a menos que o valor seja simples [A-Za-z0-9_]+). Por exemplo:

name="John Doe"
ip=127.0.0.1
HORRIBLE=1
l0b0
fonte
5

Use exportação.

export ABC="123"

Para verificar se está definido, use

env

e / ou

env | grep ABC

Para adicioná-lo permanentemente, adicione-o ao seu ~/.bashrcarquivo.

export ABC="123"
Quem sou eu
fonte
6
Ele quer saber quente para defini-lo permanentemente , ou seja, em qual arquivo colocar a definição.
Matteo
11
Não funciona. Depois que eu sair, a variável se foi. Eu preciso dele em sessões
11
você quer dizer permenatee não permenently: D
whoami
veja edit parabashrc
whoami
5
o que permenate? você quer dizer permanent?
SSH Esta
3

O comando exato é:

echo 'export ABC = "123"' >> ~/.profile
Иван Бишевац
fonte
4
Exatamente? A sério? Qual shell (a) lê ~/.profilee (b) permite espaço antes e depois =?
G-Man
1

A melhor maneira que funcionou para mim é modificar o arquivo .bashrc no shell BASH.

use isto por exemplo:

  1. abra o seu arquivo .bashrc
  2. adicione esta linha:

    export <VARIABLE> = "<ANY PATH/VALUE you want>"
    

    por exemplo : export HOME = "/home/user/"

    Lembre-se de usar, ""pois o uso ' 'não funcionará e seu arquivo bashrc relatará erros durante a fonte.

  3. origine-o na sessão atual.

Também tentei modificar o arquivo / etc / environment, mas ele não me permitiu criar uma nova variável de ambiente e, quando a originou, solicitou o erro de que a variável definida não foi encontrada.

Ayushi Agarwal
fonte