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.
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.
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
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)
.