与 xargs 循环相关的 ENV 变量

d-_*_*_-b 4 bash xargs environment-variables

export当同一个脚本同时运行多次时,环境变量(使用设置)是否有不同的处理方式?这是一个奇怪的问题,所以这是我构建的一个示例,它类似于我的实际问题。

你好.sh

#!/bin/bash
export COUNTER=$((COUNTER+1));
echo $COUNTER;
sleep 5;
/hello.sh
Run Code Online (Sandbox Code Playgroud)

数字.txt

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

猛击

# cat /nums.txt | xargs -L 1 -P 5 /hello.sh
Run Code Online (Sandbox Code Playgroud)

预期产出

1
2
3
4
5
   (...5 seconds later)
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)

实际产出

1
1
1
1
1
   (... 5 seconds later)
2
2
2
2
2
Run Code Online (Sandbox Code Playgroud)

所以只运行一次,效果很好。但是,当我开始多次并行运行它时,就是我目睹了这种行为的时候。我认为这是有原因的,但我不知道如何防止它。

为了添加背景,我的目标是当每个脚本完成时,它会从 $COUNTER 读取的下一个增量开始备份。这样我就可以从 5 个单独的线程开始设置一次,每个线程都会不断增加并调用脚本。

Joh*_*024 5

是的,你是对的,这类似于“如何在 shell 脚本中“导出”环境变量? “。

如果将变量定义为:

COUNTER=$((COUNTER+1))
Run Code Online (Sandbox Code Playgroud)

那么它只存在于当前的 shell 中。此 shell 创建的子 shell 或调用 shell 都不会看到它。使用导出时:

export COUNTER=$((COUNTER+1))
Run Code Online (Sandbox Code Playgroud)

那么这个shell的子shell也可以看到这个变量。

当您使用 xargs 创建 5 个进程时,它们每个都继承调用 shell 的环境。然而,它们彼此不共享对环境的任何更改。