equivalente ao `setx` no Ubuntu

9

O Windows possui um comando PowerShell chamado setxCria ou modifica variáveis ​​de ambiente no ambiente do usuário ou do sistema.

O Ubuntu possui um comando semelhante, ou seja, não usando nanoou vi, apenas uma linha para adicionar ou atualizar uma variável de ambiente em todo o sistema.

Solução implementada

Uma linha para adicionar / atualizar

grep env_name /etc/environment && sed -i.bak 's/env_name=.*/env_name="env_value"/' /etc/environment || echo 'env_name="env_value"' >> /etc/environment
Ayman
fonte

Respostas:

12

Você pode fazer isso simplesmente declarando-o como novo na linha de comando ou declarando-o novamente. Por exemplo, se você deseja adicionar ~/testfolderà sua variável de caminho, basta inseri-la no seu terminal atual (este é apenas um exemplo):

PATH="$HOME/testfolder:$PATH"

Obviamente, isso só será alterado durante o tempo em que a sessão do terminal estiver aberta. Observe o $uso aqui, você o deixa de fora para declaração, mas se quiser exibi-lo, precisará adicioná-lo $para expandir seu conteúdo.

Se você deseja declará-las mais duradouras e gerais, pode adicioná-las ao seu ~/.bashrcarquivo (somente para você) ou em /etc/bash.bashrc(todo o sistema), por exemplo, se desejar que contem apenas para você ou para todos os usuários. Outra opção é adicioná-lo ao seu .profilearquivo (somente para você), onde será viável a partir do momento em que você efetuar login. Você pode fazer isso echopor exemplo, se tiver certeza de que essa variável ainda não está definida ou se você criar novas. (apenas um exemplo):

echo "variable=value" >> /path/filename

Se no entanto quiser editar um arquivo fora do seu diretório de usuário que é o caso quando você quer editar /etc/bash.bashrcvocê precisa usar sudoe assim você não pode simplesmente usar um 'aqui documento' uma vez que este não iria funcionar, em vez usar, em seguida, uma linha como a seguir:

echo "variable=value" | sudo tee -a /path/filename

Se a variável já existir, você pode alterá-la com o sedcomando (também apenas um exemplo):

sed -i.bak 's/variable=value/variable=new-value/' /path/filename

Isso editará a variável no arquivo, mas criará um backup dela antes da edição. Se você alterar arquivos fora do diretório de usuários com o sed, precisará usar sudona maioria dos casos, para que a linha seja:

sudo sed -i.bak 's/variable=value/variable=new-value/' /path/filename

A remoção de uma variável de um arquivo também pode ser feita sed, basta deixar a segunda parte do regex vazia:

sed -i.bak 's/variable=value//' /path/filename

Se você estiver interessado em quais variáveis ​​de ambiente estão definidas, use o envcomando para listá-las, ( set -o posix ; set ) | lessou sh -c set. Todos os três fornecem várias quantidades de saída, ( set -o posix ; set ) | lessdevolvendo a maioria das variáveis ​​que estão realmente definidas.

Videonauth
fonte
11
Em vez de ( set -o posix ; set )é mais fácil dizer sh -c set. Isso funcionará mesmo que shseja um link simbólico para bash(que normalmente não está nas versões modernas do Ubuntu).
Ruslan #
O @ruslan sh -c setnão mostra realmente todas as variáveis ​​de ambiente definidas no sistema. No entanto, vou incluí-lo como uma terceira maneira de mostrar alguns deles.
Videonauth 29/11/17
Na verdade sh -c setmostra todas as variáveis ​​de ambiente . Ele simplesmente não mostra variáveis ​​de shell do shell de chamada, mas nunca são herdadas por um processo executado a partir desse shell, a menos que você exportas faça.
Ruslan
Existe alguma razão válida para editar /etc/environment? Parece que isso é um atalho para confusão.
21417 Roger
@RogerLipscombe Obrigado, não tinha certeza disso, ainda é um local viável para editar variáveis, mas eu o tirei por não causar confusão.
Videonauth 29/11
11

Não existe um equivalente direto de setx /m, mas existem maneiras de realizar o que setx /mfaz.

setx /mputs variable=valueem HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment. Não- / m (ou seja, por utilizador) setxsimplesmente coloca o variable=valueem HKCU\Environment.

Você pediu especificamente para 'todo o sistema'. Para isso, você adicionaria o par de valor variável a /etc/environmentOR para /etc/profile.d/<yourfile>. O primeiro é avaliado por pam, enquanto o último é avaliado por /bin/sh. Assim, em /etc/profile.d/<yourfile>, você adicionaria variable=value; export variable. (o bash também permite export variable=value). Para /etc/environmentvocê adicionar variable=value.

Os equivalentes por usuário são ~/.pam_environmente ~/.profile.

Veja também: https://help.ubuntu.com/community/EnvironmentVariables

Cyrus Patel
fonte
7

Você pode exportar variáveis ​​de ambiente na linha de comandos, mas isso não afetará o ambiente efetivo nos processos já iniciados, apenas no processo atual e em seus subprocessos. Portanto, na prática, você geralmente precisa se conectar novamente ao alterar variáveis ​​de ambiente.

Gunnar Hjalmarsson
fonte