1

我已经定义了一个 Env 变量: export NBR_PROCESS=2

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

#!/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。

知道我在这里错过了什么吗?谢谢 !

4

3 回答 3

5

你必须“来源”

资源your_script


编辑 1
看到这个答案...


编辑 2

. filename [arguments] 或者 source filename [arguments]

完整解释:

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

于 2012-08-27T16:25:30.080 回答
3

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

您可以使用 bash 函数或evalorsource内置函数(间接调用export内置函数)。

阅读高级 bash 脚本指南

于 2012-08-27T16:25:06.730 回答
2

每次您运行脚本时,它都会获取您(或正在执行的用户)环境变量的新副本 - 并且它们保持在该进程的本地。换句话说,任何被修改的变量都只针对该实例进行修改。

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

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

于 2012-08-27T16:25:16.327 回答