É possível passar variáveis de ambiente de filho para pai no espaço do usuário? [duplicado]

4

Do pseudo terminal /dev/pts/id tentando exportar key=value do script filho, então variáveis exportadas devem ser passadas como parent, se possível?

echoing cmd > /proc/$$/fd/0 não executa cmd , apenas visualiza o comando no emulador de terminal do shell e, claro, usando $(cmd) em vez de cmd executa em subshell, e export não adiciona variáveis ao pai processo.

EDITAR

(1) assumindo que todo o trabalho deve ser feito no lado da criança.

(2) perguntou nos comentários, o que eu estou tentando alcançar? essa é uma pergunta geral, e estou tentando usar a resposta positiva para passar variáveis do script executado pelo shell pai para que o usuário possa se beneficiar das variáveis adicionadas sem qualquer trabalho adicional, ou seja, se o script de instalação do aplicativo, o aplicativo deve ser adicionado no pai caminho do shell.

    
por Error 22.06.2017 / 05:52

3 respostas

8

Não, não é possível.

As variáveis de ambiente só podem ser passadas de pai para filho (como parte da exportação / herança do ambiente), e não o contrário.

    
por 22.06.2017 / 05:56
4

Você pode transmitir valores de variáveis de um filho para o processo pai por meio de um arquivo ou um pipe nomeado.

Aqui está um exemplo teórico mais simples:

processo filho:

echo ${variable} >/tmp/file

processo pai:

read variable </tmp/file
    
por 22.06.2017 / 07:57
2

Isso é muito complicado se o processo pai não estiver esperando e cooperando com ele. Nesse caso, consulte alterar o ambiente de um processo em execução e Existe uma maneira de alterar as variáveis de ambiente de outro processo?

Se o processo pai estiver esperando o valor e cooperar com a transferência, A maneira mais simples é usar a substituição de comandos:

export VAR=$(cmd)

Isso pressupõe que o valor da variável é a coisa única que o programa quer escrever. Se o processo filho precisar ser capaz de gravar na tela (especificamente, a stdout dos pais), podemos fazer isso ocultando o descritor de arquivo pai 1 em outro descritor de arquivo:

exec 3>&1       # Copy our file descriptor 1 into file descriptor 3.
                # child_prog will be invoked with file descriptor 1 pointing to a pipe
                # for the command substitution, but all other file descriptors intact.
                # Specifically, fd3 will point to our stdout.
export var=$(child_prog)
exec 3>&-       # (Optionally) close fd3 as cleanup.

Agora, se child_prog for curto e simples, pode ser mais fácil simplesmente escrever o valor para a variável para descritor de arquivo 1 e use o descritor de arquivo 3 ( cmd >&3 ) como a saída padrão. Se for grande e / ou complexo, você vai querer fazer algo como:

exec 5>&1       # Redirect fd1 (the command substitution pipe) to fd5.
exec 1>&3       # Set our fd1 (stdout) to our parent's stdout (which was passed in as fd3).
exec 3>&-       # Close fd3; it’s no longer needed.

e, em seguida, use stdout normalmente e use >&5 para gravar o valor.

Até agora eu tenho presumido que você quer passar apenas um valor para uma variável. Se você tiver vários valores, é uma questão simples de delimitá-los com um caractere (ou string) isso é garantido para não aparecer em nenhum dos valores. Se selecionarmos @@ , o pai poderá dizer

exec 3>&1
temp=$(child_prog)
exec 3>&-
export var1="${temp%%@@*}"
rest="${temp#*@@}"
export var2="${rest%%@@*}"
export var3="${rest#*@@}"

e a criança pode dizer echo "value1@@value2@@value3" >&5 .

Se é difícil encontrar uma sequência de caracteres de impressão Com a garantia de não aparecer em nenhum dos valores, você pode usar a nova linha. Basta alterar @@ para nova linha nos comandos acima:

Pai:

export var1="${temp%%
*}"
rest="${temp#*
}"
export var2="${rest%%
*}"
export var3="${rest#*
}"

Criança:

printf "%s\n" "value1" "value2" "value3" >&5

Ainda outra variação é ter o filho alimentando comandos de volta para o pai, em vez de valores. Se o pai disser . <(child_prog) , ele executa o filho, captura a saída e a executa . Então a criança pode fazer

printf "export var1='value1'\nexport var2='value2' var3=\"value3\"\n" >&5

(Eu testei isso com um value3 que continha um apóstrofo, então eu tive que citá-lo com \"…\" , e deixei assim apenas para ilustrar a sintaxe alternativa.)

Uma característica desta técnica é que você pode adicionar variável (s) para ser exportado sem alterar o código no pai.

Essa abordagem requer que o processo pai esteja executando o bash (ou talvez um dos outros shells avançados?), já que o POSIX não suporta <(cmd) .

    
por 22.06.2017 / 11:47