[Toybox] Command exit numbers.
Rob Landley
rob at landley.net
Tue Jun 13 15:52:32 PDT 2017
On 06/12/2017 10:49 AM, enh wrote:
> On Sat, Jun 10, 2017 at 11:29 AM, Rob Landley <rob at landley.net> wrote:
>> Would it be useful if perror_exit() set exitval to errno by default
>> instead of 1? They're well defined values that let you know _what_ happened.
>
> ...except the caller doesn't know whether it's looking at an errno
> value. and what could a caller realistically do anyway? it's bad
> enough working out what exactly EINVAL means if the last thing you did
> was call mmap, but if you just ran toybox... that failure could be
> coming from anywhere.
It's nonzero, and 99% of the time _all_ we're saying with the exit code
is "it's nonzero".
Right now it's providing the errno info in human readable format via
perror_exit(), and if a script really wants to know it can... parse the
string and hope nobody ever changes the locale? I guess that's the best
we can do. :P
>> I just fixed grep so it doesn't error_exit() when it hits a dangling
>> symlink (because fdopen() failed to covert fd to file *), but
>> perror_msg() sets errno to 1, and "grep -rq blah" has 1 mean "didn't
>> find what we were grepping for". In this instance, finding it stops and
>> returns 0 immediately so if you hit one of those it won't change the
>> results, but the caller can't distinguish "did not find" from "hit
>> dangling symlink and wanted to report it as an error" unless they
>> capture stderr. In this case that's probably fine, but it made me think
>> about the more general problem.
>
> isn't grep a well-known special case?
Not according to posix?
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html
> "if any error occurs and -q is not given, the exit status is 2."
https://xkcd.com/221/
Posix just says >1 for error, which A) I don't think I've implemented
yet, B) would argue against the errno approach because 1 is EPERM and
that's a commonish failure:
$ ./ls /root
ls: /root: Permission denied
That said, I can make grep _start_ returning 2 for errors. I still have
to do --color before you can use the toybox one. (Did 90% of it once and
got distracted for a month then lost it to a "git clean -fdx && git
checkout -f" in the wrong directory. As usual.)
>> The downside would be other commands that use error return values other
>> than 0 and 1 already. This could create false positives for that.
>
> i've certainly seen scripts explicitly check for 0 and 1 exit statuses.
I was thinking "cmp", which is _currently_ doing the 0 1 or 2 thing. :)
Hmmm... that sort of implies perror_exit() should set errno to 2 instead
of setting it to 1? But again, a potentially intrustive change so
probably not.
>> *shrug* Thought I'd ask. I still have this annoying cold and trying to
>> think through it myself right now isn't getting a lot of traction.
>
> seems to me like it would break a lot of expectations, while not being
> obviously usable?
Yeah, I couldn't quite see the way to make proper use of this
information either. I thought that might be because I'm under the
weather, but if nobody else is seeing one...
It's probably one of those things where if toybox had done it from the
start, it'd be fine, but as the installed base grows the cost of changes
to existing commands gets higher. :P
Rob
P.S. I an wrestling with your help text processing issue as we speak,
hope to have the fix checked in today. And THEN I can cut the release...
More information about the Toybox
mailing list