Como passar variáveis de ambiente para um shell não interativo (com exemplo)?

6

Em um script sh, outro script sh é iniciado com su -l <user> -c /path/to/script.sh . Até onde eu entendi, script.sh será executado em um shell não interativo. A documentação oficial tenta explicar como definir variáveis em um shell não interativo, ou seja, passá-las em BASH_ENV [ link ]. Esta é obviamente uma explicação insuficiente para um iniciante e não há exemplo (real) (não encontrou nenhum em $ SEARCH_ENGINE também).

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

pode significar muito [1]. Alguém pode dar um exemplo de uma variável de ambiente passada para um shell não interativo.

Apenas para ter certeza: a diferença entre login e não-login, bem como interativa e não-interativa, é clara para mim ( link ou link referenciado se alguém estiver interessado). Eu simplesmente preciso de um exemplo.

[1] eu tentei

  • BASH_ENV="\$PATH=$PATH\n\$JAVA_HOME=$JAVA_HOME" su -l artifactory -c echo $JAVA_HOME
  • BASH_ENV="\$PATH=$PATH\n\$JAVA_HOME=$JAVA_HOME" su -l artifactory -c echo $JAVA_HOME
  • su -l artifactory -c echo $JAVA_HOME
por Karl Richter 29.09.2014 / 03:09

1 resposta

5

Se for um script sh - como em, ele referencia explicitamente #!/bin/sh - que ainda pode ser bash , mas seria como invocá-lo com --posix --no-rc --no-profile -, você pode especificar o arquivo ENV com a variável de ambiente ENV :

ENV=/path/to/rcfile sh

Variáveis específicas precisam ser declaradas na linha de comando - como acima para $ENV - ou então com export . Por exemplo, para $PATH você faz:

export "PATH=$PATH:/some/more/paths"; sh

A variável $BASH_ENV que você faz referência não é um arquivo que precisa ser originado - e não é interpretado de qualquer maneira quando bash é invocado como sh -, mas é um caminho para um arquivo originado quando bash shell não interativo é invocado - como com um script que especifica o:

#!/bin/bash

... ou qualquer outra linha bang.

Outra maneira de invocar seu script / shell é com o utilitário env . Ele pode ser usado para remover explicitamente valores do ambiente ou, como normalmente é mais fácil, para limpá-los desde o início:

env - BASH_ENV=/path/to/rcfile /usr/bin/bash /some/script/file

Isso dirá a env para invocar o comando /usr/bin/bash - com todos os seus argumentos anexados - com a variável de ambiente $BASH_ENV especificada, mas de outra forma com um ambiente limpo inteiramente.

    
por 29.09.2014 / 03:16