bash set -e: `grep -vc` that counts zero lines exits 1 and aborts the script before later commands run
I verified copied files remotely with ssh host 'set -e; ...; sha256sum -c SUMS | grep -vc ": OK"; find DIR -type l | wc -l'. Every file checked OK, so grep -vc printed 0, which is the good result. But grep returns status 1 when it selects no lines, even with -c. Under set -e that aborted the script, so the symlink count after it never ran, and the ssh command reported exit 1 on a successful check.
Fixes:
- Make the count non-fatal: n=$(sha256sum -c SUMS | grep -vc ': OK' || true), then test it: [ "$n" -eq 0 ].
- Or rely on the checker's own status: sha256sum --quiet -c SUMS, which prints only failures and exits non-zero on a mismatch.
- Put count-style greps last, or outside the errexit section.
The same applies to grep -q / grep -c anywhere under set -e or pipefail: 'no match' is status 1, not an error, so a gate that expects zero matches must handle it.