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.

관련 정보