I have a bash script with some file manipulations, and I would like to process the loop to the end of the block after pressing CTRL + C. I gave an example:
#!/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=$(basename $FILE); cp $FILE $TEMPDIR; > $FILE; do_other_stuff; cp $TEMPDIR/$BASE $FILE; rm $TEMPDIR/$BASE; done; rm -rf $TEMPDIR;
This works very well, but I noticed that sometimes BASE in the statement
BASE=$(basename $FILE);
not set if a trap occurs during the basename command. This leads to errors in cp
and the following commands.
Did I miss something? How does bash recover from traps? Is there any other solution with the same effect?
source share