On Tue, 1 Jul 2025, Marcin Cieslak wrote:
| On Mon, 3 Feb 2025, Andrew L. Moore wrote:
|
| On 1/30/25 12:34:21, Antonio Diaz wrote:
| | Since 2006[1] GNU ed provides the option '-l,
| | --loose-exit-status'[2] to prevent some errors from affecting
| | the exit status of an interactive session. (It was suggested by
| | Karl Berry IIRC):
|
| Antonio,
| When ed was handed to you, it already reset the exit status on
| successful write, sigh. Replacing that behavior with a
| command-line option is useless if ed is invoked by another
| process, as is the case when EDITOR=ed. And setting EDITOR='ed -l'
| breaks when ed doesn't recognize option `-l'. Leave Karl out of
| it. He's smarter than that.
|
|
| I think this was a recurring theme on this mailing list over the
| years.
|
| Let's simplify the code - there is no need to collect errors along
| the way, just to set the exit code at the end.
|
| What about ed 2.0 without "-l" option, returning exit code >0 only
| if it really stops on error?
This is available as github.com/slewsys/ed. In addition to providing
the extensions that users having been requesting for years, when
compiled without extensions (now fixed, sorry), it adheres to the
POSIX standard more closely than the current GNU ed.
| Regarding POSIX, I believe it is important that both EXIT STATUS and
| CONSEQUENCES
| OF ERRORS sections of standard should be read together (here 2017
wording):
|
| EXIT STATUS
|
| The following exit values shall be returned:
|
| 0
| Successful completion without any file or command errors.
| >0
| An error occurred.
|
| CONSEQUENCES OF ERRORS
|
| When an error in the input script is encountered, or when an error
| is detected that is a consequence of the data (not) present in the
| file or due to an external condition such as a read or write error:
|
| If the standard input is a terminal device file, all input shall
| be flushed, and a new command read.
|
| If the standard input is a regular file, ed shall terminate with
| a non-zero exit status.
|
| The newer versions replace the last sequence with a reference to
| the generic error handling description.
|
| Maybe "any" file or command errors is unlucky, but to me it is clear
| that when reading from a terminal device file, there is no need
| to exit and set the exit code, just flush and continue.
This unlucky behavior is, in fact, historical: if _any_ error occurred
during an
interactive editing session, the exit code would be non-zero. This
wasn't an issue until later utilities which invoked ed then acted on the
exit status. POSIX never evolved to address this issue, as the use of
the word "any" indicates.
In ed 2.x, the default behavior is exactly as you propose. To strictly
adhere to the historical behavior, it's necessary to set the
environment variable POSIXLY_CORRECT.
|
|
| Marcin
|