假设我有foo.sh
,它使用parallel:调用bar.sh
# foo.sh
#! /bin/bash
parallel -N 3 bar.sh ::: $(seq 10)
我的bar.sh
是这样工作的:如果设置了一个环境变量(例如DEBUG=1),那么它将输出大量调试信息。
理想情况下,我只想像这样执行我的foo.sh
:
$ DEBUG=1 foo.sh
通常情况下,foo.sh
有$DEBUG
值,bar.sh
也看到了它。但现在我使用GNU并行调用bar.sh
,这是一个本地程序,我的bar.sh
不再设置DEBUG
值。
我读到--env
只有在我设置了远程执行-S
的情况下才有效,从我的尝试来看,它似乎对我不起作用
有没有一种方法可以让我的并行bar.sh
简单地"继承"我的foo.sh
的环境设置?当并行调用bar.sh
时,我真的不想详细说明每个环境变量及其值。
TIA
您正在寻找能够做到这一点的env_parallel
。
把这个放在$HOME/.bashrc:中
. `which env_parallel.bash`
例如,通过执行:
echo '. `which env_parallel.bash`' >> $HOME/.bashrc
别名
alias myecho='echo aliases'
env_parallel myecho ::: work
env_parallel -S server myecho ::: work
env_parallel --env myecho myecho ::: work
env_parallel --env myecho -S server myecho ::: work
功能
myfunc() { echo functions $*; }
env_parallel myfunc ::: work
env_parallel -S server myfunc ::: work
env_parallel --env myfunc myfunc ::: work
env_parallel --env myfunc -S server myfunc ::: work
变量
myvar=variables
env_parallel echo '$myvar' ::: work
env_parallel -S server echo '$myvar' ::: work
env_parallel --env myvar echo '$myvar' ::: work
env_parallel --env myvar -S server echo '$myvar' ::: work
阵列
myarray=(arrays work, too)
env_parallel -k echo '${myarray[{}]}' ::: 0 1 2
env_parallel -k -S server echo '${myarray[{}]}' ::: 0 1 2
env_parallel -k --env myarray echo '${myarray[{}]}' ::: 0 1 2
env_parallel -k --env myarray -S server echo '${myarray[{}]}' ::: 0 1 2
env_parallel
是GNU并行20160722的一部分。这是测试版的质量,所以如果你发现任何错误,请报告。
如果你了解你的UNIX,你就会知道你不能在从当前shell启动的shell中使用别名、非导出函数、非导出变量和非导出数组(例如在bash -c
中);尤其是如果外壳是远程的(例如ssh server myalias
)。对于env_parallel
,必须将这一常识修改为:如果不作弊,你就无法做到这一点。
为了复制整个环境,使用_
作为--env
:导出的变量
parallel --env _ -N 3 bar.sh ::: $(seq 10)