【问题标题】:GNU parallel inheriting environment variable while executing a local script执行本地脚本时 GNU 并行继承环境变量
【发布时间】:2016-08-05 07:46:58
【问题描述】:

假设我有 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 并行调用本地程序 bar.sh,我的 bar.sh 不再具有 DEBUG 值集。

我读到--env 仅在我设置了远程执行-S 时才有效,并且从我的尝试看来它对我不起作用。

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

TIA

【问题讨论】:

  • 这是#!/bin/bash,不是$!/bin/bash

标签: linux bash parallel-processing gnu-parallel


【解决方案1】:

您正在寻找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 的一部分。它是 beta 质量,所以如果发现任何错误,请报告。

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

【讨论】:

  • 我在尝试安装最新版本的parallel 时遇到问题:The signature on parallel-20160722.tar.bz2 is wrong. 但我的(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 试图下载2016-08-08
【解决方案2】:

为了复制整个环境,使用_作为--env导出的变量:

parallel --env _ -N 3 bar.sh ::: $(seq 10)

【讨论】:

    猜你喜欢
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 2018-10-04
    • 2017-06-26
    相关资源
    最近更新 更多