GNU 在执行本地脚本时并行继承环境变量
GNU parallel inheriting environment variable while executing a local script
假设我有 foo.sh
使用并行调用 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 parallel 调用 bar.sh
,这是一个本地程序,我的 bar.sh
不再设置 DEBUG
值。
我读到 --env
只有在我设置了远程执行 -S
的情况下才有效,但从我的尝试来看,它似乎对我不起作用。
有没有办法让我的并行 bar.sh
简单地 "inherit" 我的 foo.sh
的环境设置?我真的不想在并行调用 bar.sh
时详细说明每个环境变量及其值。
TIA
为了复制整个环境,使用_
作为--env
导出的变量:
parallel --env _ -N 3 bar.sh ::: $(seq 10)
您正在寻找 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 Parallel 20160722 的一部分。它是测试版质量,所以如果您发现任何错误,请报告。
如果你了解你的 UNIX,你就会知道你不能在从当前 shell 开始的 shell 中使用别名、非导出函数、非导出变量和非导出数组(例如 bash -c
);尤其是如果 shell 是远程的(例如 ssh server myalias
)。有了env_parallel
,这个常识就得修改成:不作弊就做不到。
假设我有 foo.sh
使用并行调用 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 parallel 调用 bar.sh
,这是一个本地程序,我的 bar.sh
不再设置 DEBUG
值。
我读到 --env
只有在我设置了远程执行 -S
的情况下才有效,但从我的尝试来看,它似乎对我不起作用。
有没有办法让我的并行 bar.sh
简单地 "inherit" 我的 foo.sh
的环境设置?我真的不想在并行调用 bar.sh
时详细说明每个环境变量及其值。
TIA
为了复制整个环境,使用_
作为--env
导出的变量:
parallel --env _ -N 3 bar.sh ::: $(seq 10)
您正在寻找 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 Parallel 20160722 的一部分。它是测试版质量,所以如果您发现任何错误,请报告。
如果你了解你的 UNIX,你就会知道你不能在从当前 shell 开始的 shell 中使用别名、非导出函数、非导出变量和非导出数组(例如 bash -c
);尤其是如果 shell 是远程的(例如 ssh server myalias
)。有了env_parallel
,这个常识就得修改成:不作弊就做不到。