Instead of
BASE=$(basename $FILE);
Have this one instead:
BASE=${FILE##*/}
It's also a good idea to place your work functions on the background away from the interface that handles SIGINT. Just avoid asking for input within it. Also quote your variables properly always.
#!/bin/bash
# Register signal handler
ABORT=0;
trap ABORT=1 SIGINT;
# Create temp dir
TEMPDIR=$(mktemp -d -t $0);
# Helper functions
function do_other_stuff {
true;
}
# Process files
for ((COUNTER = 0; COUNTER < 3 && ABORT == 0; COUNTER++)); do
(
FILE=/some/directory/$COUNTER.txt
BASE=${FILE##*/}
cp "$FILE" "$TEMPDIR"
> "$FILE"
do_other_stuff
cp "$TEMPDIR/$BASE" "$FILE"
rm "$TEMPDIR/$BASE"
) &
CPID=$!
# Handle SIGINT but don't end the loop until subprocess finishes its work.
while kill -s 0 CPID &>/dev/null; do ## Checks if subprocess is still there.
# Wait if yes.
wait "$CPID"
done
done
rm -rf "$TEMPDIR"
This one will abort the operation quickly:
# Process files
for ((COUNTER = 0; COUNTER < 3 && ABORT == 0; COUNTER++)); do
(
FILE=/some/directory/$COUNTER.txt
BASE=${FILE##*/}
cp "$FILE" "$TEMPDIR"
> "$FILE"
do_other_stuff
cp "$TEMPDIR/$BASE" "$FILE"
rm "$TEMPDIR/$BASE"
) &
CPID=$!
while
wait "$CPID"
if [[ ABORT -eq 1 ]]; then
kill -s ABRT "$CPID" &>/dev/null
break
fi
kill -s 0 "$CPID" &>/dev/null
do
continue
done
done
rm -rf "$TEMPDIR"