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

Ste*_*Chu 5 linux parallel-processing bash gnu-parallel

假设我使用并行进行foo.sh调用bar.sh

# foo.sh

#! /bin/bash

parallel -N 3 bar.sh ::: $(seq 10)
Run Code Online (Sandbox Code Playgroud)

我的bar.sh工作方式是这样的:如果设置了环境变量(例如DEBUG=1),那么它将输出大量调试信息。

理想情况下,我想简单地执行我的foo.sh这样:

$ DEBUG=1 foo.sh
Run Code Online (Sandbox Code Playgroud)

通常,foo.sh有价值$DEBUG并且bar.sh能够看到它。但现在我使用 GNU parallel 来调用bar.sh,这是一个本地程序, mybar.sh不再有DEBUG值集。

我读到,--env只有在我设置了远程执行的情况下才有效-S,从我的尝试来看,它似乎对我不起作用。

有没有办法让我的并行化bar.sh简单地“继承”我的环境设置foo.sh?我真的不想在bar.sh并行调用时详细说明每个环境变量及其值。

TIA

Ole*_*nge 1

您正在寻找env_parallel正是这样做的。

将其放入 $HOME/.bashrc 中:

  . `which env_parallel.bash`
Run Code Online (Sandbox Code Playgroud)

例如通过这样做:

  echo '. `which env_parallel.bash`' >> $HOME/.bashrc
Run Code Online (Sandbox Code Playgroud)

别名

  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
Run Code Online (Sandbox Code Playgroud)

功能

  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
Run Code Online (Sandbox Code Playgroud)

变量

  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
Run Code Online (Sandbox Code Playgroud)

数组

  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
Run Code Online (Sandbox Code Playgroud)

env_parallel是 GNU Parallel 20160722 的一部分。它是测试版质量,因此如果发现任何错误,请报告错误。

如果您了解 UNIX,您就会知道不能在从当前 shell 启动的 shell 中(例如在 )中使用别名、非导出函数、非导出变量和非导出数组bash -c;尤其是如果 shell 是远程的(例如ssh server myalias)。这个常识必须修改为:不作弊env_parallel就做不到。