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 个单独的线程开始设置一次,每个线程都会不断增加并调用脚本。
是的,你是对的,这类似于“如何在 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 的环境。然而,它们彼此不共享对环境的任何更改。