

It was just a quick solution showing how to do it with one macro and zero dependencies, utilizing the power of meta variables. It probably can be made nicer.
Side Note: It’s not directly relevant/needed here, but this also shows that maybe a theoretical $reverse{} meta variable can be useful with repeated patterns, to in this case generate the variants in the expected order.
// Don't bail on the first error, but remember the worst one. let mut worst = 0; for file in files { if let Err(e) = chmod_one(file) { worst = worst.max(e.exit_code()); } } process::exit(worst);This is not rustic, I feel.
files.iter() .map(chmod_one) .filter_map(Result::err)is more like it.
From there, you can
next()for first error,last()for last error, orfold()for max error, orcollect()if you need to save all errors.This is not true in musl systems. I just quickly checked in a Chimera rootfs (which has a system dynamic musl libc btw).
I believe the described
dlopening is one of the well known reasons why GNU libc is not suitable for static linking, unlike musl!In Arch, this indeed loads
/usr/lib/libnss_systemd.so.2.Everyone can test this with
strace id 2>&1 | egrep 'open.*\.so'.