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.tmpましたrm_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 はシェルからジョブを作成します。次のように考えてください。

bash -c 'the job'

以下では変数を取得できません。

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

part の配列に値を追加してもbash -c親項目として返されることはありません。

ただし、機能するようにスクリプトを変更することもできますparset

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

その後、少し後処理を行いますmyresults

関連情報