Usando exportação no .bashrc

45

Percebi no meu .bashrcque algumas linhas têm exportna frente deles, como

export HISTTIMEFORMAT="%b-%d  %H:%M  "
...
export MYSQL_HISTFILE="/root/.mysql_history"

enquanto outros não, como

HISTSIZE=100000

Gostaria de saber se, primeiro, isso está correto e, em segundo, qual é a regra para uso exportno .bashrc.

Martin Vegter
fonte

Respostas:

53

Você precisa apenas exportde variáveis ​​que devam ser "vistas" por outros programas iniciados no shell, enquanto as que são usadas apenas dentro do próprio shell não precisam ser exporteditadas.

Isto é o que a página de manual diz:

The  supplied  names are marked for automatic export to the environ‐
ment of subsequently executed commands.  If the -f option is  given,
the  names  refer to functions.  If no names are given, or if the -p
option is supplied, a list of all names that are  exported  in  this
shell  is  printed.   The -n option causes the export property to be
removed from each name.  If a variable name is  followed  by  =word,
the  value  of  the variable is set to word.  export returns an exit
status of 0 unless an invalid option  is  encountered,  one  of  the
names  is  not a valid shell variable name, or -f is supplied with a
name that is not a function.

Isso pode ser demonstrado com o seguinte:

$ MYVAR="value"
$ echo ${MYVAR}
value
$ echo 'echo ${MYVAR}' > echo.sh
$ chmod +x echo.sh
$ ./echo.sh

$ export MYVAR="value-exported"
$ ./echo.sh
value-exported

Explicação:

  • Primeiro, configurei ${MYVAR}para ser uma variável do Shell com MYVAR="value". Usando echoeu posso ecoar o valor dele, porque o eco faz parte do shell.
  • Então eu crio echo.sh. Esse é um pequeno script que basicamente faz o mesmo, apenas ecoa ${MYVAR}, mas a diferença é que ele será executado em um processo diferente porque é um script separado.
  • Ao chamá- echo.shlo, não produz nada, porque o novo processo não herda${MYVAR}
  • Depois exporto ${MYVAR}para o meu ambiente com a exportpalavra - chave
  • Quando agora executo o mesmo echo.shnovamente, ele ecoa o conteúdo ${MYVAR}porque o obtém do ambiente

Então, para responder sua pergunta:

Depende de onde uma variável será usada, se você precisa exportá-la ou não.

repetição
fonte
17

Use exportpara variáveis ​​de ambiente . Variáveis ​​de ambiente são um recurso do sistema operacional. As variáveis ​​de ambiente são herdadas pelos processos filhos: se você as definir em um shell, elas estarão disponíveis em todos os programas iniciados por esse shell. Variáveis ​​usadas por muitos aplicativos ou aplicativos específicos que não sejam shells são variáveis ​​de ambiente. Aqui estão alguns exemplos de variáveis ​​de ambiente comuns:

  • HOME- indica o diretório inicial do usuário, onde os arquivos de configuração por usuário estão localizados. Usado por qualquer programa que lê arquivos de configuração por usuário ou precisa conhecer o local do diretório inicial do usuário.
  • PATH- indica onde encontrar arquivos executáveis ​​para iniciar outros programas. Usado por qualquer programa que precise iniciar outro programa.
  • LD_LIBRARY_PATH- indica onde encontrar arquivos dinâmicos da biblioteca. Usado por todo executável vinculado dinamicamente.
  • EDITOR, VISUAL- indica qual programa executar quando um editor é necessário. Usado por qualquer programa que precise iniciar um editor de texto.
  • DISPLAY, XAUTHORITY- indica como se conectar ao servidor X11. Utilizado por clientes X11 (ou seja, programas GUI).
  • LESS- opções ativadas automaticamente quando lessé executada. Usado por less.
  • http_proxy- indica o proxy da web a ser usado. Usado pela maioria dos navegadores da web.

Não use exportpara variáveis ​​de shell. As variáveis ​​do shell são um recurso do shell como uma linguagem de programação. As variáveis ​​do shell são usadas apenas dentro do shell onde estão definidas; eles não têm significado para os programas lançados pelo shell. As variáveis ​​do shell são duplicadas quando um subshell é criado, como o restante do estado do shell. Aqui estão alguns exemplos de variáveis ​​de shell que têm significado para os shells populares:

  • PS1 - o prompt para exibir antes de cada comando.
  • IFS - os caracteres que separam as palavras em expansões variáveis ​​não citadas e substituições de comandos.
  • HISTFILE - um arquivo em que o shell gravará o histórico de comandos.

Além das variáveis ​​usadas pelo shell, a maioria dos scripts de shell usa variáveis ​​para seus propósitos internos.

A maioria das variáveis ​​de ambiente (por exemplo PATH) faz sentido para uma sessão inteira e deve ser configurada em ~/.profileou em um arquivo semelhante. Variáveis ​​que fazem sentido apenas para um shell específico (por exemplo PS1) devem ser definidas em um arquivo específico do shell, como ~/.bashrcou ~/.zshrc. Consulte Existe um arquivo equivalente ".bashrc" lido por todos os shells?

Gilles 'SO- parar de ser mau'
fonte
3

Para variáveis ​​internas do bash, você não precisa export. A partir do seu exemplo HISTTIMEFORMATé usado por si só festa e não precisa de uma exportação MYSQL_HISTFILEé para mysqle que as necessidades de exportação de outra forma mysqlnão vê-lo.

Zelda
fonte