Por que a mudança de $ PATH afeta os shells filhos, mas a troca de $ foo não é?

6
$ unset foo
$ unset bar
$ echo $foo

$ echo $bar

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
$ foo=a
$ bar=b
$ export bar
$ echo $foo
a
$ echo $bar
b
$ PATH=
$ echo $PATH

$ /bin/bash
bash: lesspipe: No such file or directory
bash: dircolors: No such file or directory
bash: ls: No such file or directory
$ echo $foo

$ echo $bar
b
$ echo $PATH

$

Como podemos ver, a alteração de $PATH afeta a subshell, enquanto outra variável precisa ser export ed. Por quê?

    
por Motte001 22.07.2016 / 15:57

2 respostas

11

Existem realmente dois tipos de variáveis:

  1. Variáveis de ambiente
  2. Variáveis da shell

Para tornar as coisas mais complicadas, ambas têm a mesma aparência, e uma variável shell pode ser convertida em uma variável de ambiente com o comando export .

O comando env mostrará o conjunto atual de variáveis de ambiente.

$ myvar=100
$ env | grep myvar
$ export myvar
$ env | grep myvar
myvar=100

As variáveis também podem ser exportadas temporariamente para a duração de um comando.

$ env | grep anothervar
$ anothervar=100 env | grep anothervar
anothervar=100
$ env | grep anothervar
$ 

Quando o shell é inicializado, ele herda várias variáveis de ambiente (que podem ser zero).

Os scripts de inicialização (por exemplo, .bash_profile , .bashrc , arquivos no diretório /etc ) também podem definir e exportar variáveis.

Finalmente, o próprio shell pode definir um número padrão para variáveis de ambiente se o ambiente estiver vazio. por exemplo,

$ PATH=foo /bin/bash -c 'echo $PATH'
foo
$ PATH= /bin/bash -c 'echo $PATH'

$ unset PATH
$ /bin/bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
    
por 22.07.2016 / 16:32
4

Eu recomendo que você leia isto artigo .

Existe uma grande diferença entre as variáveis shell e ambiente. PATH é um dos ambientes, e é já exportado (por padrão), portanto, alterando-o, o shell atual é usado e todos os outros - quaisquer shells ou processos filhos - será afetado.

PATH é uma lista de diretórios que o sistema verificará ao procurar por comandos. Então, mesmo que você queira mudá-lo ou adicionar algo a ele, é melhor usar PATH="$PATH:... , já que você precisa ter o PATH original para executar comandos, mas se você alterar isso completamente, você deve usar seus comandos inserindo o caminho absoluto, por exemplo /bin/pwd .

Mas foo que você está exportando não é algo que tenha algum efeito no shell ou nos processos, sei que você está tentando torná-lo uma variável de ambiente, mas ainda não definiu algo eficaz é por isso que você não consegue ver o efeito que pode ter em outras coisas, na verdade é o que você está definindo por suas próprias necessidades no momento, ou seja, para acompanhar alguns dados efêmeros, então seria melhor mantê-lo apenas uma variável de shell. Por exemplo, quando você está tentando fazer alguns projetos matemáticos, você pode precisar definir algo e tê-los por um curto período de tempo, assim você pode definir apenas algumas variáveis do shell sem precisar exportá-las.

Espero poder ser preciso, mas ainda assim recomendo que você leia o artigo em questão e brinque com a alteração de algumas dessas variáveis, para que você entenda completamente. BTW, se você quiser que uma variável de ambiente seja permanente, você deve adicioná-las como uma linha no seu .bashrc ou .bash_profile .

    
por 22.07.2016 / 16:40