On Tue, Mar 28, 2023 at 11:07:17PM -0400, Eric Sunshine wrote: > > I just think chainlint.pl is doing a good enough job of catching it that > > we can rely on it. I'll be curious if Eric has input there on whether it > > can do even better, which would remove all of the caveats from the > > commit message. > > It was an intentional design choice, for the sake of simplicity, _not_ > to make chainlint.pl a shell syntax checker, despite the fact that it > is genuinely parsing shell code. After all, the shell itself -- by > which test code will ultimately be executed -- is more than capable of > diagnosing syntax errors, so why burden chainlint.pl with all that > extra baggage? Instead, chainlint.pl is focussed on detecting semantic > problems -- such as broken &&-chain and missing `return 1` -- which > are of importance to _this_ project. Yeah, I'm not too surprised to hear any of that, and I almost wrote off chainlint.pl for this purpose (hence the hand-waving in my commit message). But after realizing it has to find here-docs anyway to ignore them, it seemed reasonable to bend it to my will. ;) Thanks again for your patch. > [1]: Why is that, by the way? Is `eval` not complaining about the > unclosed here-doc? Is that something that can be fixed more generally? > Are there other syntactic problems that go unnoticed? The behavior varies from shell to shell. Historically, I suspect it was a deliberate decision to read until EOF, because it lets you stick arbitrary data at the end of a script, like: $ cat foo.sh my_prog <<\EOF 1 2 3 4 5 6 7 8 [imagine kilobytes of data tables here] without having to worry about terminating it. I think I've seen it with something like: { echo "uudecode <<\EOF | tar tf -" tar cf - Documentation | uuencode - } >foo.sh which makes foo.sh a sort of self-extracting tarball. (As an aside, I was disappointed that I did not have uuencode installed by default on my system. How times have changed. ;) ). These days bash will warn about it, but dash will not: $ bash foo.sh | wc -l foo.sh: line 129028: warning: here-document at line 1 delimited by end-of-file (wanted `EOF') 901 $ dash foo.sh | wc -l 901 Bash still has a zero exit code, though, so aside from the stderr cruft (which is hidden unless you are digging in "-v" output), the tests would pass. I can't remember when bash started warning, though "git log -S" in its repo suggests it was bash 4.0 in 2009. -Peff