【问题标题】:Passing static variables to GNU Parallel [closed]将静态变量传递给 GNU Parallel [关闭]
【发布时间】:2020-12-15 03:06:30
【问题描述】:

在一个 bash 脚本中,我试图将多个不同的 fastq 文件和几个用户提供的静态变量传递给 GNU Parallel。我无法对静态变量进行硬编码,因为虽然它们不会在脚本中更改,但它们是由用户设置的,并且在使用之间是可变的。我尝试了几种不同的方法,但收到错误argument -b/--bin: expected one argument

尝试 1:

binSize="10000"
outputDir="output"
errors="1"
minReads="10"

ls fastq_F* | parallel "python myscript.py -f split_fastq_F{} -b $binSize -o $outputDir -e $errors -p -t $minReads" 

尝试 2:

    my_func() {
      python InDevOptimizations/DemultiplexUsingBarcodes_New_V1.py \
             -f split_fastq_F$1 \
             -b $binSize \
             -o $outputDir \
             -e $errors \
             -p \
             -t $minReads
    }
    export -f my_func

    ls fastq_F* | parallel my_func

显然我没有正确传递静态变量...但我似乎无法掌握正确的方法是什么。

【问题讨论】:

  • 您是否考虑过exporting 这些变量?给我的错误信息表明$binSize 的内容没有进入调用...
  • 这是个好主意,我会试试的。感谢您的建议。
  • 结果:在“尝试 2:”的上下文中,导出似乎有所帮助,但它导致了不同的错误“没有这样的文件或目录:'split_fastq_F'”,表明我的更改变量被错误地传递给函数。
  • 更新结果:导出解决了问题。上面提到的其他问题是由于与我的实现无关的问题。
  • 我认为使用parallel my_func ::: fastq_F*的样式会更安全、更正确

标签: linux bash multithreading loops gnu-parallel


【解决方案1】:

当 GNU Parallel 无法达到您的预期时,请始终尝试 --dr

binSize="10000"
outputDir="output"
errors="1"
minReads="10"

ls fastq_F* | parallel --dr "python myscript.py -f split_fastq_F{} -b $binSize -o $outputDir -e $errors -p -t $minReads"

您使用的是 " 而不是 ' 所以变量应该在 GNU Parallel 启动之前被 shell 替换。

如果命令在本地运行(即不是远程),您可以使用export VARIABLE

如果在远程服务器上运行,请使用env_parallel:

env_parallel --session

alias myecho='echo aliases'
env_parallel -S server myecho ::: work
myfunc() { echo functions $*; }
env_parallel -S server myfunc ::: work
myvar=variables
env_parallel -S server echo '$myvar' ::: work
myarray=(arrays work, too)
env_parallel -k -S server echo '${myarray[{}]}' ::: 0 1 2

env_parallel --end-session

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2018-11-28
    • 2020-05-25
    • 2015-03-06
    相关资源
    最近更新 更多