Se você alterar uma variável de ambiente em outro shell, ela mudará ou permanecerá igual em outros shells?

1

Se eu criar uma variável de ambiente no bash, como SPORT = baseball, mude para tcsh e mude para "running". Se eu mudar de volta para o bash, o SPORT será exibido como "em execução"? (Eu tentaria por mim mesmo, mas eu só tenho bash)

    
por Shoulderpadz 07.09.2017 / 07:36

2 respostas

2

Aqui está uma experiência prática que faz exatamente o que você perguntou; ele executa bash , define uma variável de ambiente, inicia tcsh e altera seu valor. Em seguida, ele verifica o valor em bash .

#!/bin/bash

export SPORT=baseball
printf 'SPORT is "%s"\n' "$SPORT"

tcsh -c 'echo $SPORT; setenv SPORT archery; echo $SPORT'

printf 'SPORT is "%s"\n' "$SPORT"

A execução deste script bash , que invoca tcsh , resultará em

SPORT is "baseball"
baseball
archery
SPORT is "baseball"

Mas nem precisamos mudar para tcsh para ver isso em ação, basta introduzir um subshell, que tem um ambiente separado, com (...) em nosso script bash :

#!/bin/bash

export SPORT=baseball
printf 'SPORT is "%s"\n' "$SPORT"

(
    echo "$SPORT"
    export SPORT=archery
    echo "$SPORT"
)

printf 'SPORT is "%s"\n' "$SPORT"

A saída permanecerá a mesma.

É impossível que um ambiente afete outro com uma exceção : Um novo ambiente herda variáveis de ambiente do ambiente pai. Um subshell (como no último exemplo) também herda variáveis de shell não exportadas.

    
por 07.09.2017 / 08:10
3

Não é isso que variáveis de ambiente significam. Um "ambiente" é específico de um processo. Ele pode (ou não) ser herdado por outros processos extraídos desse processo, dependendo de várias coisas. Modificar o ambiente de um processo em execução nunca afetará outros processos em execução. *

Leia sobre o que as variáveis de ambiente significam em especificações POSIX . (E entenda que este documento é destinado a implementadores , não a usuários.)

* ou, pelo menos, uma exceção a isso exigiria algumas boas habilidades de codificação de baixo nível. Não sei se é possível em C; talvez com memória compartilhada. Mas isso não aconteceria sem ser explicitamente projetado dessa maneira.

    
por 07.09.2017 / 07:54