如何让 GNU 并行加载变量
How to get GNU parallel to load variables
我正在尝试让 GNU parallel 读入一个文件并从中加载 BASH 个变量,然后对它们执行一些操作。
例如:
ls -1 build*/*.properties | parallel source {}; echo "var set to: $foo";
其中每个 *.properties 文件的格式为:
foo=bar
var=blah
但是,当我尝试使用 "source" 或“.”时要将文件中的变量作为 Bash 变量加载,从文件中设置变量似乎不起作用。
$ ls -1 build*/*.properties | parallel source {} ; echo "variable set to $foo";
variable set to
谁能告诉我我做错了什么?我知道一定有一个简单的方法可以做到这一点。
parallel
是一个程序,而不是内置命令,因此它可以获取您的变量,但仅限于其上下文。
变量不会传播到父进程,所以你不能那样做。
您遇到了非并行版本
for i in build*/*.properties
do
source $i
done
(注意:同样的问题,如果你这样做 source $i &
:创建了另一个进程,你丢失了结果)
第一个错误是:
ls -1 build*/*.properties | parallel source {}; echo "var set to: $foo";
被Bash解释为:
ls -1 build*/*.properties | parallel source {}
echo "var set to: $foo";
这显然不是你想要的。
一个改进是引用 ;
ls -1 build*/*.properties | parallel "source {}; echo var set to: $foo";
但它仍然没有做正确的事情,因为变量是用双引号插入的。所以 GNU Parallel 看不到字符串 $foo。 Bash 在 GNU Parallel 启动之前用 $foo 的内容替换 $foo。所以我们需要强制Bash不要用$foo:
的值替换$foo
ls -1 build*/*.properties | parallel 'source {}; echo "var set to: $foo"';
或者一样好:
ls -1 build*/*.properties | parallel source {}\; echo \"var set to: $foo\"
如果您发现引用很麻烦,请使用 Bash 函数:
mybuild() {
source ""
echo "var set to: $foo"
}
export -f mybuild
ls -1 build*/*.properties | parallel mybuild {}
# or shorter:
parallel mybuild ::: build*/*.properties
我正在尝试让 GNU parallel 读入一个文件并从中加载 BASH 个变量,然后对它们执行一些操作。
例如:
ls -1 build*/*.properties | parallel source {}; echo "var set to: $foo";
其中每个 *.properties 文件的格式为:
foo=bar
var=blah
但是,当我尝试使用 "source" 或“.”时要将文件中的变量作为 Bash 变量加载,从文件中设置变量似乎不起作用。
$ ls -1 build*/*.properties | parallel source {} ; echo "variable set to $foo";
variable set to
谁能告诉我我做错了什么?我知道一定有一个简单的方法可以做到这一点。
parallel
是一个程序,而不是内置命令,因此它可以获取您的变量,但仅限于其上下文。
变量不会传播到父进程,所以你不能那样做。
您遇到了非并行版本
for i in build*/*.properties
do
source $i
done
(注意:同样的问题,如果你这样做 source $i &
:创建了另一个进程,你丢失了结果)
第一个错误是:
ls -1 build*/*.properties | parallel source {}; echo "var set to: $foo";
被Bash解释为:
ls -1 build*/*.properties | parallel source {}
echo "var set to: $foo";
这显然不是你想要的。
一个改进是引用 ;
ls -1 build*/*.properties | parallel "source {}; echo var set to: $foo";
但它仍然没有做正确的事情,因为变量是用双引号插入的。所以 GNU Parallel 看不到字符串 $foo。 Bash 在 GNU Parallel 启动之前用 $foo 的内容替换 $foo。所以我们需要强制Bash不要用$foo:
的值替换$fools -1 build*/*.properties | parallel 'source {}; echo "var set to: $foo"';
或者一样好:
ls -1 build*/*.properties | parallel source {}\; echo \"var set to: $foo\"
如果您发现引用很麻烦,请使用 Bash 函数:
mybuild() {
source ""
echo "var set to: $foo"
}
export -f mybuild
ls -1 build*/*.properties | parallel mybuild {}
# or shorter:
parallel mybuild ::: build*/*.properties