GNU并行继承环境变量,同时执行本地脚本



假设我有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)

最新更新