Tendo problemas ao definir variáveis ​​de ambiente no Terminal no macOS High Sierra

Tendo problemas ao definir variáveis ​​de ambiente no Terminal no macOS High Sierra

Tenho um problema ao definir uma variável de ambiente no meu MacBook Pro executando o macOS High Sierra.

No terminal, tentei configurar uma variável de ambiente executando export VARIABLE_URL=example.com. Tentei então verificar se a variável de ambiente estava definida com echo $VARIABLE_URL, mas retornou um resultado em branco.

Agora, sempre que inicio o terminal, recebo esta mensagem:

Last login: Tue Apr  2 15:08:56 on ttys000
[1]   Done                    export VARIABLE_URL=example.com
[2]   Done                    appVersion=
[3]   Done                    osVersion=
[4]   Done                    deviceType=
[5]+  Done                    deviceId=
My-MacBook-Pro:~ me$

Tentei adicionar a variável ao meu .bash_profilearquivo, mas mesmo isso não define a variável corretamente. Toda vez que faço isso echo $VARIABLE_URL, ele retorna em branco.

Eu configurei outras variáveis ​​no meu arquivo .bash_profile, mas esta é a única variável que meu computador se recusa a adicionar.

Mesmo quando executo printenv, todas as variáveis ​​de ambiente são exibidas, exceto VARIABLE_URL.

Por que não consigo definir esta variável de ambiente?

Editar: Aqui está o conteúdo do meu .bash_profile:

export BACKEND=example
export VARIABLE_URL=example.com
export HOST=localhost
export BASEURL=example
export SECRET=example
export USERNAME=example
export ACCESS_KEY=example

Edit2: Aqui está o que é exibido quando abro o terminal agora:

Last login: Wed Apr  3 13:06:20 on ttys000
+ export BACKEND=example
+ BACKEND=example
+ export 'VARIABLE_URL=example.com'
+ VARIABLE_URL='example.com'
+ appVersion=
+ osVersion=
+ deviceType=
+ clientType=
+ export HOST=localhost
+ HOST=localhost
+ export BASEURL=example
+ BASEURL=example
+ export SECRET=example
+ SECRET=example
+ export USERNAME=example
+ USERNAME=example
+ export ACCESS_KEY=example
+ ACCESS_KEY=example
+ deviceId=
My-MacBook-Pro:~ me$

...e aqui está o que é retornado quando printenvé executado:

TERM_PROGRAM=Apple_Terminal
USERNAME=example
SHELL=/bin/bash
TERM=xterm-256color
TMPDIR=/var/folders/g6/q9bwlzxn36jfb2j53c5t_t080000gn/T/
Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.GZQ9CxlO7F/Render
TERM_PROGRAM_VERSION=404.1
TERM_SESSION_ID=45B1D3A5-719E-4C24-9026-C52A374B3809
USER=me
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.nXK7LMtVZx/Listeners
BACKEND=example
SECRET=example
HOST=localhost
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Wireshark.app/Contents/MacOS
PWD=/Users/me
LANG=en_US.UTF-8
XPC_FLAGS=0x0
XPC_SERVICE_NAME=0
SHLVL=1
HOME=/Users/me
LOGNAME=me
ACCESS_KEY=example
BASEURL=example
_=/usr/bin/printenv
My-MacBook-Pro:~ me$

Edição Final: Foi resolvido! Adicionar aspas simples ao URL resolveu o problema:

export VARIABLE_URL='example.com'

Eu deveria ter explicado explicitamente que o URL mostrado nestas perguntas é um URL de espaço reservado, não aquele que estava realmente no meu arquivo .bash_profile. Na verdade, o URL real contém vários &caracteres. Sinto muito por não explicar isso desde o início. Sinto que se tivesse feito isso, o problema teria sido resolvido mais cedo. Independentemente disso, obrigado a todos pela ajuda e sugestões, estou muito feliz por ter tudo resolvido agora.

Responder1

Minha hipótese:

Seu URL real usa o método HTTP GET, assim:

export VARIABLE_URL=example.com?foo=bar&appVersion=&osVersion=&deviceType=&deviceId=&fizz=buzz

Onde ?e &fazem parte da sintaxe da URL, mas o shell os interpreta de maneira diferente. &faz com que o comando anterior seja executado em segundo plano. Também é um separador, portanto, em vez de um comando, você tem vários. O primeiro é

export VARIABLE_URL=example.com?foo=bar

e esse valor é exportado como VARIABLE_URL.

Outra suposição: shopt -s nullglobestá ativo, portanto, a ?partir da sintaxe GET faz com que o unquoted $VARIABLE_URLse expanda para uma string nula em qualquer diretório onde não haja arquivos correspondentes ao padrão example.com?foo=bar.

Você quer

export VARIABLE_URL='example.com?foo=bar&appVersion=&osVersion=&deviceType=&deviceId=&fizz=buzz'

onde aspas simples fazem o shell tratar ?e &os caracteres literalmente (aspas duplas também funcionariam com este exemplo específico; mas não sei seu URL real, aspas simples são mais seguras em geral). Adicionalmente

echo "$VARIABLE_URL"

onde aspas duplas evitam globbing (que de outra forma ocorreria por causa ?do conteúdo da variável), independentemente dos nullglobarquivos e no diretório atual.

Responder2

Pela saída que você obtém de .bash_profile, suponho que você tenha algo assim:

export VARIABLE_URL=example.com & appVersion= & osVersion= & deviceType= & deviceId= & somethingelse=

Você não quer os &caracteres " " ali, eles mudam o significado de maneiras irrelevantes e inúteis. Você pode definir várias variáveis ​​de ambiente em um único exportcomando, separando-as com espaços:

export VARIABLE_URL=example.com appVersion= osVersion= deviceType= deviceId= somethingelse=

Ou pode ser mais claro usar apenas um exportcomando separado para cada variável:

export VARIABLE_URL=example.com
export appVersion=
export osVersion=
export deviceType=
export deviceId=
export somethingelse=

Aliás, o motivo " &" causa problemas é que ele é um delimitador entre comandos e faz o comando antes de ser executado em segundo plano. Portanto, cada atribuição é tratada como um comando completamente separado (apenas o primeiro é an export, o restante são variáveis ​​de shell não exportadas) e todos, exceto o último, são executados em segundo planoem processos separados, e as definições são locais para esses processos (e desaparecem quando esses processos terminam). Isso é o que são todas aquelas linhas "Concluído" - elas indicam que os processos em segundo plano foram concluídos.

informação relacionada