Inspeção de como $ PATH é criado

2

É possível "ouvir" o valor de uma variável durante o início de um novo shell?

Eu tenho um script que verifica a variável $ PATH nos lugares típicos, mas gostaria de tentar algo diferente. Aqui está o que estou pensando:

Em vez de apenas adivinhar onde $ PATH está definido, eu gostaria de gerar um novo shell para o usuário em segundo plano, executando um comando chamado algo como "path-inspector". O path-inspector gera um novo shell para o usuário atual e ouve a variável $ PATH. Talvez ele defina $ PATH para uma string vazia primeiro, mas sempre que $ PATH for modificado, o comando echo sairá do nome do arquivo com o número da linha que modificou $ PATH. Seria como definir pontos de interrupção e ter um depurador específico para $ PATH.

Eu ainda sinto que estou no estágio em que não sei como ter uma ideia clara de como isso pode ser implementado. Aqui está o que eu sei que eu preciso abordar:

  • Subshells não podem exportar variáveis de volta para o pai Eu precisaria planejar uma abordagem para ecoar ou relatar os resultados.
  • Não conheço nenhum componente interno que "escute" uma variável, então também preciso de uma abordagem para isso. Possivelmente injetar um comando antes e / ou após cada comando no novo shell é executado para ecoar ou tee a saída?
  • Variáveis ambientais não são apenas essas grandes coisas globais, elas são criadas para cada shell e, mais especificamente, para cada processo . Eles serão semelhantes, mas eu precisaria pelo menos estar ciente de que, por exemplo, um shell não interativo pode não ter o mesmo $ PATH como um shell de login. Portanto, se o comando criar um "subshell", ele poderá ou não usar as mesmas configurações de um shell de login normal.
  • Conchas diferentes. bash, sh, zsh, peixe, etc.

Estou aberto a comentários de qualquer tipo: "Já foi feito", "Não é possível" ou "você também precisa saber sobre isso". etc.

    
por brock 24.04.2014 / 14:40

1 resposta

0

ksh na verdade implementa um recurso interessante chamado discipline functions que basicamente permite que você inclua retornos de chamada para definir ou fazer referência a uma variável:

$ cat t.sh
#!/bin/ksh

PATH=

function PATH.set
{
    echo "new PATH in ${.sh.file}:${.sh.lineno}:"
    echo "  old = [${PATH}]"
    echo "  new = [${.sh.value}]"
}

PATH=/bin:/usr/bin:/sbin:/usr/sbin
PATH=$PATH:$PATH

.

$ ./t.sh
new PATH in t.sh:12:
  old = []
  new = [/bin:/usr/bin:/sbin:/usr/sbin]
new PATH in t.sh:13:
  old = [/bin:/usr/bin:/sbin:/usr/sbin]
  new = [/bin:/usr/bin:/sbin:/usr/sbin:/bin:/usr/bin:/sbin:/usr/sbin]

Da mesma forma, PATH.get seria executado toda vez que $PATH fosse referenciado.

Infelizmente, como parece que você não pode exportar funções em ksh93 , isso restringiria o retorno de chamada ao script atual, limitando sua utilidade geral.

    
por 24.04.2014 / 15:07