假设我有
export MY_VAR=0
在~/.bashrc
。
我有一个打开的gnome终端,在这个终端中,我将$MY_VAR
value 更改为200
。所以,如果我愿意
echo $MY_VAR
显示在此终端200
中。
现在,我在gnome终端中打开了另一个标签,然后执行
echo $MY_VAR
...而不是200
,我有0
。
当终端修改环境变量,并使此修改(设置为200)可用于所有后续子shell等时,我该怎么做才能保持200的值?这可能吗?
假设我有
export MY_VAR=0
在~/.bashrc
。
我有一个打开的gnome终端,在这个终端中,我将$MY_VAR
value 更改为200
。所以,如果我愿意
echo $MY_VAR
显示在此终端200
中。
现在,我在gnome终端中打开了另一个标签,然后执行
echo $MY_VAR
...而不是200
,我有0
。
当终端修改环境变量,并使此修改(设置为200)可用于所有后续子shell等时,我该怎么做才能保持200的值?这可能吗?
Answers:
环境的副本传播到子外壳,因此可以正常工作:
$ export MY_VAR=200
$ bash
$ echo $MY_VAR
200
但是由于它是一个副本,因此您无法通过父外壳获得该值-至少不通过更改环境即可。
听起来您实际上想更进一步,那就是使行为类似于全局变量,由独立于父级启动的“同级” shell共享,例如Gnome Terminal中的新选项卡。
通常,答案是“您不能,因为环境变量不能那样工作”。但是,还有另一个答案,那就是,您总是可以破解一些东西。一种方法是将变量的值写入文件,例如~/.myvar
,然后将其包含在中~/.bashrc
。然后,每个新的Shell将从从该文件读取的值开始。
您可以更进一步-将~/.myvar
其MYVAR=200
设置为format ,然后设置PROMPT_COMMAND=source ~/.myvar
,这将导致每当您收到新提示时都重新读取该值。它仍然不是相当一个共享的全局变量,但它开始像它。但是,直到提示再次出现时,它才会激活,这取决于您要尝试执行的操作,可能是一个严重的限制。
然后,当然,下一步是将更改自动写入~/.myvar
。事情变得有些复杂,我将在此处停止,因为实际上,环境变量并不是要作为外壳间的通信机制,最好是找到另一种方式来做到这一点。
鱼壳可以这样做:
set -U MY_VAR 0
(请参阅http://fishshell.com/docs/current/commands.html#set)
要从另一个shell执行fish命令,可以运行fish -c
,例如:
fish -c "set -u MY_VAR 0"
根本不要使用环境变量。使用文件。
为防止进程在更新/读取文件时互相踩踏,请使用lockfiles和小型前端更新程序脚本,其目的只是在未锁定的情况下使用$ 1更新文件。锁定文件的实现基本上是通过检查特定文件是否存在(/var/run/yourscript.lck),如果存在,则等待该文件消失一段时间,如果不存在则失败。此外,完成更新文件后,您必须删除锁定文件。
准备处理由于文件繁忙而导致脚本无法更新文件的情况。
mkdir
可以作为原子的测试和创建。
flock(2)
ln -s dummy lockfile
(即使损坏)也可能起作用,因为如果符号链接已经存在,它将失败。我想知道一种测试这种方法是否真正100%安全的方法。