Por que alterar uma variável em um script não a altera fora do script?

Por que alterar uma variável em um script não a altera fora do script?

Digamos que eu seja exportuma variável com o terminal. Depois disso eu chamo um script que altera essa variável para outra coisa. Mas quando volto ao terminal e echoà variável, ela permanece com seu valor original.

O que posso fazer se quiser que a variável seja alterada e visível fora do script, não apenas láemo roteiro. Aqui está um exemplo do que quero dizer:

ares@ares-HP-ProBook-4530s:~$ export package=tree
ares@ares-HP-ProBook-4530s:~$ cat script3.sh 

#! /bin/bash
#set -x
echo $package
apt-cache show $1 | head -1
if [ $? -eq 0 ]; then
    package=1
else
    package=0
fi
echo $package

Saída ao executar o script

ares@ares-HP-ProBook-4530s:~$ ./script3.sh gnome-terminal
tree
Package: gnome-terminal
1
ares@ares-HP-ProBook-4530s:~$ echo $package
tree
ares@ares-HP-ProBook-4530s:~$ 

Responder1

Seu processo shell possui uma cópia do ambiente do pai e não tem nenhum acesso ao ambiente do processo pai. Quando o seu processo shell termina, todas as alterações feitas em seu ambiente são perdidas. Obter um arquivo de script é o método mais comumente usado para configurar um ambiente shell. Você pode apenas querer se arriscar e manter um para cada um dos dois tipos de shell.

Encontrei esta respostaaqui

Responder2

fonte seuarquivo.sh

Isso deve fazer o necessário.

Responder3

Outra possibilidade é criar uma função no seu .bashrc e chamar essa função dentro do shell atual; isso economizará um pouco de digitação. Você ainda pode passar variáveis.

Este é o método que uso em vez de um alias se precisar de um pouco mais de flexibilidade.

Responder4

Novo processo obtidocópia dede cada variável exportada.

Você precisa fazer um dos seguintes:

  • faça todas as operações no mesmo processo (fornecendo o script no shell atual)
  • mantenha o valor em lugar comum (sqlite, arquivo simples) e leia/grave-o em cada processo

informação relacionada