Script Bash para mostrar variáveis de env recém-introduzidas

4

Estou fazendo este script de teste para me ajudar a fazer engenharia reversa de scripts encarregados de configurar o ambiente de desenvolvimento.

O script:

#env-changes
#!/bin/bash
TESTED_SCRIPT=$1
shift
ENV_BEFORE=$(env | sort)
. $TESTED_SCRIPT
ENV_AFTER=$(env | sort)
diff <(printf '%s\n' "$ENV_BEFORE") <(printf '%s\n' "$ENV_AFTER")

Script env envolta:

#!/bin/bash
export I_AM_NEW=hello

Uso:

$ ./env-changes dummy-env-script.sh 
21a22
> I_AM_NEW=hello

Atualmente, só funciona com bash . Sugestões sobre como tornar mais compilação POSIX?

    
por TheMeaningfulEngineer 14.03.2016 / 13:30

1 resposta

5

Em primeiro lugar, o comando POSIX source só irá fornecer arquivos de diretórios no PATH . Para contornar isso, você precisará usar um caminho completo:

sh ./env-changes ./dummy-env-script.sh

Além disso, a versão portátil de source é . :

. "$1"

Em seguida, a construção <() não é POSIX, portanto, você precisará contornar isso. Por exemplo, você pode usar arquivos temporários:

tmp1=$(mktemp)
tmp2=$(mktemp)
env | sort > "$tmp1"
. "$1"
env | sort > "$tmp2"
diff "$tmp1" "$tmp2"
rm  "$tmp1" "$tmp2"

Ou uma abordagem diferente:

ENV_BEFORE=$(env)
. "$1"
ENV_AFTER=$(env)
printf -- '%s\n%s\n' "$ENV_BEFORE" "$ENV_AFTER" | sort | uniq -u

Aqui, imprimimos as duas variáveis, classificamos, passamos uniq -u , que imprime linhas únicas, imprimindo apenas a nova variável:

$ sh ./env-changes ./dummy-env-script.sh 
I_AM_NEW=hello
    
por 14.03.2016 / 14:51