Onde a variável PATH é definida quando inicio um shell Bash com env -i bash?

2

Eu sei que as variáveis de ambiente são definidas por meio da leitura ou da execução de vários arquivos de configuração, como /etc/environment , /etc/profile , ~/.profile , ~/.bashrc , etc.

Mas quando eu estava lendo esta postagem do blog , tentei iniciar um shell bash interativo sem login sem importar ambiente, usando o seguinte comando:

 osboxes@osboxes:~$ env -i bash

Depois de entrar no novo shell, verifiquei a variável PATH e obtive o seguinte resultado:

osboxes@osboxes:/home/osboxes$ echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Até onde eu sei, esse shell interativo sem logon não lê /etc/environment ou source /etc/profile ou ~/.profile ; só origina /etc/bash.bashrc e ~/.bashrc .

Então como é a variável PATH neste conjunto de shell? Existe um arquivo específico para ler ou pesquisar?

    
por jack_lv 01.11.2018 / 09:27

2 respostas

1

Verifique se printenv não tem valor para PATH. Se você encontrar algo, provavelmente é do seu ~/.bashrc . Se estiver vazio, foi definido pelo próprio Bash. Quando o shell é iniciado, se ele não puder encontrar um valor para o PATH, ele definirá um, porque muito pouco funcionará sem o PATH.

Você pode ver como isso é feito no código-fonte (estou vendo a fonte do Bash 4.4.18, no Ubuntu 18.04):

Em variables.c :

  /* Now make our own defaults in case the vars that we think are
     important are missing. */
  temp_var = set_if_not ("PATH", DEFAULT_PATH_VALUE);
#if 0
  set_auto_export (temp_var);   /* XXX */
#endif

Em config-top.h você pode encontrar a definição (que corresponde ao PATH que você mostra):

/* The default value of the PATH variable. */
#ifndef DEFAULT_PATH_VALUE
#define DEFAULT_PATH_VALUE \
  "/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
#endif

Eu acredito que muitas vezes é considerado uma má prática colocar . no PATH porque torna muito fácil executar coisas acidentalmente!

    
por 01.11.2018 / 10:18
1

Como o manual do shell Bourne Again explica, existe um valor padrão para a variável shell PATH , se não houver uma variável de ambiente PATH para inicializá-la e a variável shell não estiver definida em um script de inicialização. / p>

De qual depende esse valor é, de acordo com o manual, "o administrador do sistema que instala bash ". Na verdade, isso depende de quais opções foram escolhidas pela pessoa que compilou o shell Bourne Again a partir da fonte.

  • No pacote Debian do shell Bourne Again, ele está próximo do exemplo padrão do manual:
    % unsetenv PATH 'command -v bash' -c 'echo $PATH ; printenv PATH'
    /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
    %
  • Na porta / pacote do OpenBSD do shell Bourne Again, é o mesmo:
    $ unsetenv PATH 'command -v bash' -c 'echo $PATH ; printenv PATH'
    /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
    $
  • Na porta / pacote do FreeBSD do shell Bourne Again, ele foi um pouco quebrado:
    % unsetenv PATH 'command -v bash' -c 'echo $PATH ; printenv PATH'
    /sbin:/bin:/usr/sbin:/usr/bin:/usr/games:%%LOCALBASE%%/sbin:%%LOCALBASE%%/bin
    %
    Isso foi ajustado em março de 2017, aprimorando as opções do compilador usadas para construir o software.

O fato de printenv não imprimir uma linha indica que essa variável shell PATH padrão não é exportada para uma variável de ambiente, por sinal.

    
por 01.11.2018 / 10:33