I maintain the Amsterdam Compiler Kit, a compiler toolchain dating from about 1984. It makes extensive use of code generation using a variety of slightly dubious scripts in many languages, including ed.
Since about ed 1.11, the ACK fails to build because some of the ed scripts won't run any more. Here is an example of one:
echo "/* this part is generated from $1 at: " `date` "*/"
ed -s $1 <<'EOI'
g/:d/s/^\(...\):\(.\).*/#define C_\1(c) CC_opcst(op_\1, c)/
g/:[cslnfzor]/s/^\(...\):\(.\).*/#define C_\1(c) CC_opcst(op_\1, c)/
g/:w/s/^\(...\).*/#define C_\1(w) CC_opcst(op_\1, w)\
#define C_\1_narg() CC_opnarg(op_\1)/
g/:g/s/^\(...\).*/#define C_\1(g) CC_opcst(op_\1, g)\
#define C_\1_dnam(g, o) CC_opdnam(op_\1, g, o)\
#define C_\1_dlb(g, o) CC_opdlb(op_\1, g, o)/
g/:p/s/^\(...\).*/#define C_\1(p) CC_oppnam(op_\1, p)/
g/:b/s/^\(...\).*/#define C_\1(b) CC_opilb(op_\1, b)/
g/:-/s/^\(...\).*/#define C_\1() CC_op(op_\1)/
When run with ed 1.13, the script fails with an exit status of 1. No diagnostics are produced and the file contents looks correct.
This looks like I'm running afoul of the warning-on-unsaved-buffer behaviour; however, changing the script to end with:
...has no effect; even though the Q command has been issued, and I've verified it's been executed, the exit status is still 1.
Does anyone know what's happening here, and if there's a way to persuade ed to quit with an exit status of 0? (I'd rather not discard ed's exit status as that would hide processing errors in the scripts.)