이 스크립트는 대상 파일이 이미 존재하는 시기를 결정하는 데 사용되며, 소스 파일은 "$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
.