GNU 并行导出函数输出到变量失败

GNU 并行导出函数输出到变量失败

该脚本用于确定目标文件何时已存在,源文件将根据标志“$dup_act”更新目标文件或将其删除。

#!/bin/bash
dup_chk()
{
  # $1: f_src, $2: f_dest, $3: dup_act (keep file u/pdate, l/arge)
  # check source file and destination file status 
  
  [[ "$3" = u && $(stat -c%Y "$1") -gt $(stat -c%Y "$2") || "$3" = l && $(stat -c%s "$1") -gt $(stat -c%s "$2") ]] \
  && echo -e "$1~$2~\n" >> mv_f.tmp || echo -e "$1\n" >> rm_f.tmp
  
  # mv_f.tmp: a list of source file replace destination one
  # rm_f.tmp: a list of source file to be removed
}

[[ -f mv_f.tmp ]] && rm mv_f.tmp ; [[ -f rm_f.tmp ]] && rm rm_f.tmp

dup_act=u # or dup_act=l

export dup_act
export -f dup_chk
cat dup_files.txt |  parallel -j10 --no-run-if-empty --colsep '~'  dup_chk {1} {2} "$dup_act"

输出文件mv_f.tmprm_f.tmp已正确生成。

现在,我想要脚本输出变量而不是文件:

#!/bin/bash
dup_chk()
{
  # $1: f_src, $2: f_dest, $3: dup_act (keep file u/pdate, l/arge)
  # check source file and destination file status 
  
  [[ "$3" = u && $(stat -c%Y "$1") -gt $(stat -c%Y "$2") || "$3" = l && $(stat -c%s "$1") -gt $(stat -c%s "$2") ]] \
  && mv_f+="$1~$2~\n" || || rm_f+="$1\n"
  
  # mv_f: a variable of source file replace destination one
  # rm_f: a variable of source file to be removed
}

mv_f= ; rm_f= 

dup_act=u # or dup_act=l

export dup_act
export -f dup_chk
cat dup_files.txt |  parallel -j10 --no-run-if-empty --colsep '~'  dup_chk {1} {2} "$dup_act"
 

结果: $mv_f变量$rm_f为空。

我在其他帖子中发现:“环境变量只能从父级传递到子级(作为环境导出/继承的一部分),而不是相反。”。是这个原因吗?

请帮忙。谢谢。

答案1

GNU Parallel 在 shell 中生成作业。将其视为:

bash -c 'the job'

您无法从中获取变量:

i=1
bash -c 'i=2'
# prints 1
echo $i

您将值添加到零件中的数组中bash -c,这不会使其返回到父级。

但您也许可以更改脚本以便可以使用parset.

# NB: parset will not work correctly if reading from a pipe
parset myresults dup_chk < dup_files.txt

然后对其进行一些后处理myresults

相关内容