도커 컨테이너 내에서 Bash 스크립트를 올바르게 실행할 수 없습니다.

도커 컨테이너 내에서 Bash 스크립트를 올바르게 실행할 수 없습니다.

Bash 스크립트를 실행하려고 합니다.

export LD_LIBRARY_PATH=/usr/lib/fsl/5.0:$LD_LIBRARY_PATH
export SUBJECTS_DIR=/output
timefmt="%C --- CPU:\t%E real,\t%U user,\t%S sys\t%P\tMem:\t%KkiBavg.,\t%MkiB max.\tExit:\t%x"
all_ids=()
for dirname in /input/*; do

id=${dirname#/input/}    # remove "/input/sub-"
id=${id%/}             # remove trailing "/"

printf 'Adding ID to recon-all processing list: %s\n' "${id}" >&2
if [ ! -e "/output/$id" ]; then
    # no output file corresponding to this ID found,
    # add it to he list       
    all_ids+=( "$id" )
    /usr/bin/time -f "$timefmt" \
    recon-all -s "${id}" -i /input/${id}/unprocessed/3T/T1w_MPR1/${id}_3T_T1w_MPR1.nii.gz -i /input/${id}/unprocessed/3T/T2w_SPC1/${id}_3T_T2w_SPC1.nii.gz
    printf 'Series with t1 found, subjects matched: %s ; %s ; %s\n' "${id}"
fi
done

printf 'Found ID: %s\n' "${all_ids[@]}" >&2

printf '%s\n' "${all_ids[@]}" | parallel --jobs 6 --timeout 300% --progress recon-all -s {.} -all -qcache

도커 컨테이너를 만들었고 결과 없이 실행되면 해당 위치로 이동하여 인쇄되지만 printf 'Adding ID to recon-all processing list: %s\n' "${id}" >&2Entrypoint=bash 옵션과 별도의 명령을 사용하여 실행하면 올바르게 실행됩니다.

bash -x script.sh의 출력:

+ for dirname in '/input/*'
+ id=102311
+ id=102311
+ printf 'Adding ID to recon-all processing list: %s\n' 102311
Adding ID to recon-all processing list: 102311
+ '[' '!' -e /output/102311 ']'
+ all_ids+=("$id")
+ /usr/bin/time -f '%C --- CPU:\t%E real,\t%U user,\t%Ssys\t%P\tMem:\t%KkiB avg.,\t%MkiB max.\tExit:\t%x' recon-all -s 102311 -i /input/102311/unprocessed/3T/T1w_MPR1/102311_3T_T1w_MPR1.nii.gz -i /input/102311/unprocessed/3T/T2w_SPC1/102
311_3T_T2w_SPC1.nii.gz

+ printf '%s\n' 100408 100610 101006 101107 101309 101410 101915 102008 102109 102311
+ parallel --jobs 6 --timeout 300% --progress recon-all -s '{.}' -all -qcache

답변1

스크립트에서 shellcheck를 실행하고 나타나는 오류와 경고를 지워 보셨나요? 내 경험에 따르면 이렇게 하면 스크립트의 견고성과 이식성이 향상됩니다.

주택 검사웹사이트가 있습니다또한 오픈 소스(GPLv3) 명령줄 도구로도 사용할 수 있습니다.

행운을 빌어요!

관련 정보