Por que o bash limpa o OLDPWD quando um script filho é iniciado?

5

O OLDPWD é exportado e passado para qualquer filho, mas o bash aparentemente limpa o OLDPWD sempre que um script filho é iniciado:

$ cd /etc
$ cd
$ perl -e 'print "<$ENV{OLDPWD}>\n"'
</etc>
$ ksh  -c 'echo "<$OLDPWD>"'
</etc>
$ bash -c 'echo "<$OLDPWD>"'
<>

Qualquer maneira de contornar isso além de criar um alias ou pontilhar o script filho ou exportar alguma outra variável com o mesmo valor, sempre que eu quiser usar $ OLDPWD em um script filho?

** ATUALIZAÇÃO 2015/11/26 **

Arquivei um relatório de bug e recebi esta resposta de Chet Ramey, o mantenedor do bash:

Why does bash clear OLDPWD when a child script is started?

     

Porque um novo shell não possui um 'diretório de trabalho anterior'.   É suposto ser definido por cd, e se você não tiver executado cd, você   não tem um.

     

Parece razoável herdar o OLDPWD se ele nomear um diretório,   da mesma forma que o shell herda PWD se ele nomear o atual   diretório, então vamos tentar isso para a próxima versão bash.

    
por jrw32982 13.11.2015 / 22:43

1 resposta

4

Provavelmente este é o comportamento de sobras há muito tempo, quando o bash implementou pela primeira vez OLDPWD . As notas de lançamento do bash 2.03 alpha (em 1999) indicam que OLDPWD anteriormente não era uma variável exportada. Se não foi exportado, não seria herdado por um processo filho.

A julgar pelo comentário sobre este pedaço da fonte de bash, o comportamento é intencional:

  /* According to the Single Unix Specification, v2, $OLDPWD is an
     'environment variable' and therefore should be auto-exported.
     Make a dummy invisible variable for OLDPWD, and mark it as exported. */
  temp_var = bind_variable ("OLDPWD", (char *)NULL, 0);
  VSETATTR (temp_var, (att_exported | att_invisible));

Embora a nota de lançamento indique que a exportação foi feita para seguir o POSIX.2, OLDPWD não aparece na lista de shell variáveis para o shell POSIX. Ele aparece na descrição de cd . Isso não menciona se um valor inicial deve ser obtido de um processo pai; não há nenhum comportamento específico que seja necessário.

Não parece ser uma característica documentada do bash; há poucos comentários a serem encontrados:

por 14.11.2015 / 03:18