Once upon a time, we needed a simple shell script that did some setup stuff and then ran a program that did all of the work; this shell script was going to run from crontab once a day. Because I'm sometimes very me, I bummed the shell script like so:
#!/bin/sh setup yadda exec realprog --option some-args
Why not use
exec
? After all, it's one less process, even if it doesn't really matter.
Later, we needed to run the program a second time with some different arguments, because we'd added some more things for it to process. So we updated the script:
#!/bin/sh setup yadda exec realprog --option some-args exec realprog --switch other-args
Yeah, there's a little issue here. It probably looks obvious written up here, but I was staring at this script just last week, knowing that for some reason it hadn't generated the relatively infrequent bit of email we'd expected, and I didn't see it then; my eyes and my mind skipped right over the implications of the repeated
exec
. I only realized what I was seeing today, when I took another, more determined look and this time it worked.
(The implication is that anything after the first
exec
will never get run, because the first
exec
replaces the shell that's running the shell script with
realprog
.)
This was a self-inflicted injury. The script in no way needed the original
exec
; putting it in there anyway in the name of a trivial optimization led directly to the error in the updated script. If I hadn't tried to be clever, we'd have been better off.
(I'm not going to call this premature optimization, because it wasn't. I wasn't trying to optimize the script, not particularly; I was just being (too) clever and bumming my shell script for fun because I could.)
PS: In the usual way of things, I felt silly for not having spotted the repeat
exec
issue last week. But we see what we're looking for, and I think that last week my big question before I checked the script was 'have we updated the script to work on the other-args'. We had a line to run the program on them, so the answer was 'yes' and I stopped there. Today I knew things had once again not happened, so I asked myself 'what on earth could be stopping the second command from running?' and the light suddenly dawned.