2012-08-27 72 views
0

我定义了一个环境变量: export NBR_PROCESS=2如何在Linux中更新Env变量?

基本上我应该可以更新变量,但是当我执行下面的脚本,我得到每次运行相同的结果:

#!/bin/bash 
echo "Script 2: Before decrement : $NBR_PROCESS" 
export NBR_PROCESS=$(($NBR_PROCESS - 1)) 
echo "Script 2: After decrement : $NBR_PROCESS" 

上每次执行我得到同样的结果如下:

Script 2: Before decrement : 2 
Script 2: After decrement : 1 

我想要做的是运行脚本递减变量NBR_PROCESS。

任何想法我在这里错过了吗?谢谢 !

回答

2

脚本(或任何可执行文件)不能更改shell的环境变量,因为它运行在不同的(子)进程中。改变内部环境的唯一方法是通过内建的export。你也可以使用env命令来设置环境的一些程序,如env YOURVAR=1 yourprogram yourarguments ......

你可以使用bash的功能或evalsource建宏(间接调用export内置)。

阅读advanced bash scripting guide

2

您运行脚本每一次,它得到你的(它是被作为执行或用户)环境变量的全新副本 - 他们留在本地这一进程。换句话说,无论修改哪些变量,都只针对该实例进行修改。

如果进程创建子进程,则是相同的事情。孩子们会收到家长环境的副本,他们所做的任何更改在他们退出时都会“消失”。

正如Luc M所述,您可以使用source将您的脚本作为Tlc进程执行。这将允许所述脚本的内容也影响您的环境。

4

你有 “源”

your_script


编辑1
this answer...


EDIT 2

. filename [arguments]source filename [arguments]

Complete explanations:

读取和在当前 外壳上下文执行从文件名参数的命令。如果文件名不包含斜线,则使用PATH变量 来查找文件名。当Bash不处于POSIX模式时,如果在$ PATH中找不到文件名,将搜索当前的 目录。如果提供了任何 参数,则在执行 文件名时,它们将成为位置参数。否则,位置参数是 不变。返回状态是执行的最后一个命令 的退出状态,如果没有执行命令,返回状态为零。如果文件名不是 找不到或无法读取,则返回状态为非零。内置的 相当于源代码。

+1

或者使用'.'(dot)命令。 –