@xhienne уже объяснил, почему, но если вы хотите, чтобы сигнал действовал сразу же (а не выходить из сценария), вы можете изменить свой код на:
#! /bin/bash -
interrupted=true
trap 'interrupted=true; echo HUP' HUP
{ cat <&3 3<&- & pid=$!; } 3<&0
while
wait "$pid"
ret=$?
"$interrupted"
do
interrupted=false
done
exit "$ret"
Небольшой танец с файловыми дескрипторами: чтобы обойти тот факт, что bash
перенаправляет стандартный ввод на /dev/null
для команд, запущенных в фоновом режиме.
Вам также необходимо удалить переднюю часть $ dir
с помощью dir = GPS $ {dir # * GPS}
.
Результирующий сценарий:
$ ls
121123_SN323_A_L002_GPS-100_R1.fastq.gz
121123_SN323_A_L002_GPS-100_R2.fastq.gz
121123_SN323_A_L002_GPS-104_R1.fastq.gz
121123_SN323_A_L002_GPS-104_R2.fastq.gz
130201_SN132_B_L007_GPS-100_R1.fastq.gz
130201_SN132_B_L007_GPS-100_R2.fastq.gz
130201_SN132_B_L007_GPS-104_R1.fastq.gz
130201_SN132_B_L007_GPS-104_R2.fastq.gz
$ for a in *.fastq.gz
do
dir=${a%_R*}
dir=GPS${dir#*_GPS}
mkdir -- "$dir" 2>/dev/null
mv -i "./$a" "$dir/"
done
$ ls
GPS-100/ GPS-104/
$ ls *
GPS-100:
121123_SN323_A_L002_GPS-100_R1.fastq.gz
121123_SN323_A_L002_GPS-100_R2.fastq.gz
130201_SN132_B_L007_GPS-100_R1.fastq.gz
130201_SN132_B_L007_GPS-100_R2.fastq.gz
GPS-104:
121123_SN323_A_L002_GPS-104_R1.fastq.gz
121123_SN323_A_L002_GPS-104_R2.fastq.gz
130201_SN132_B_L007_GPS-104_R1.fastq.gz
130201_SN132_B_L007_GPS-104_R2.fastq.gz