为什么改变脚本中的变量不会改变脚本外部的变量?

为什么改变脚本中的变量不会改变脚本外部的变量?

假设我export在终端中有一个变量。之后我调用一个脚本将该变量更改为其他值。但当我返回终端和echo变量时,它仍保持其原始值。

如果我想让变量改变并在脚本之外可见,而不仅仅是在那里,我该怎么办脚本。下面是我想说的一个例子:

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

运行脚本时的输出

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:~$ 

答案1

您的 shell 进程拥有父进程环境的副本,但无法访问父进程的环境。当您的 shell 进程终止时,您对其环境所做的任何更改都将丢失。获取脚本文件是配置 shell 环境最常用的方法,您可能只想咬紧牙关,为两种 shell 类型各维护一个脚本文件。

找到了这个答案这里

答案2

源文件.sh

这应该能满足需要。

答案3

另一种可能性是,在 .bashrc 中创建一个函数,然后在当前 shell 中调用该函数;这将节省一些输入。您仍然可以传递变量。

如果我需要更多的灵活性,我就会使用此方法而不是别名。

答案4

新流程获取复制每个导出变量。

您需要执行以下其中一项操作:

  • 在同一个进程上执行所有操作(通过在当前 shell 中执行脚本)
  • 将值保存在公共位置(sqlite,平面文件)并从每个进程读取/写入

相关内容