On 10/7/25 13:22, enh wrote:
On Tue, Oct 7, 2025 at 1:45 PM Rob Landley <[email protected]> wrote:

In bash, "echo --help" prints "--help". In /bin/bash it dumps help text.

/bin/echo I mean.

> yeah, "if you're not using -- you're already doing it wrong" sgtm.

Except for:

$ busybox echo -- hello
-- hello
$ bash -c 'echo -- hello'
-- hello
$ /bin/echo -- hello
-- hello

I'm serious that toybox _uniquely_ parses "--" in echo.

Meanwhile, "busybox echo --help" also prints "--help", as do the dash and mksh echo builtins. (I was kinda surprised they have them too, but both the behavior differing from the echo in the $PATH and "strace |& grep fork" for both dash and mksh not finding one say it's builtins.)

That's 4 votes out of 5, with the only outlier being a gnu implementation that basically never gets used even on gnu systems...

$ /usr/bin/[ --help
Usage: test EXPRESSION
  or:  test
  or:  [ EXPRESSION ]
  or:  [ ]
  or:  [ OPTION
Exit with the status determined by EXPRESSION.

Oh yeah, they got "test" wrong too. That's gnu/borked. I'm leaning towards NOHELP now.

Hmmm... The echo argument parsing is already complicated, using prefix-only logic and the "wait, we didn't understand that so back up and keep it" logic ala:

$ toybox echo --credenza
--credenza
$ toybox echo -nx
-nx
$ toybox echo a --
a --

And I already taught the plumbing that "stop at the first nonoption argument" applies to --help and --version too:

$ toybox echo --help walrus
usage: echo [-Een] [ARG...]
...
$ toybox echo walrus --help
walrus --help

Which, to be honest, should probably ALWAYS be the case. (I'm aware that gnu "ls -l potato --help" prints the help text and does not try to look for a file called potato, and yes I copied that behavior in toybox, and now I'm going... yeah gnu is nuts here.)

I could make it so --help or --version activating requires the rest of the command line to be _empty_. Which is probably good in general, because this is just gnu/wrong:

  $ touch file
  $ rm -rf file --help >/dev/null
  $ ls file
  file
  $ rm file -i
  rm: remove regular empty file 'file'?

Yeah... not liking that at all.

  $ :|rm file -i
  rm: remove regular empty file 'file'? $ ls file
  file

Doesn't even print a newline for EOF, and defaults to no. Bra fscking vo. (But grandfathered in...)

Ahem. Behavior of "echo".

Consistent behavior would say that if "echo --help" with no other arguments prints help then "test --help" with no other arguments should also print the help... which sounds like a security flaw waiting to happen, which says echo should probably be NOHELP. (As with all such commands, "help echo" and "toybox --help echo" should still work, and it's in https://landley.net/toybox/help.html#help .)

Sigh, it's another one of those "the fighting is so vicious because the stakes are so small" things. Parsing -- but not --help is silly, I can't STOP parsing -- because stuff is using it (and the argument about being able to echo just "-e" remains relevant), but test --help shouldn't (no matter what gnu's $PATH implementation says)...

Alright, --help and --version should take effect when they are the first and ONLY argument to a command, except for toybox --help command which is an existing special case. And NOHELP suppresses that first argument because "true" should still never produce output (or error on stdout refusing to accept data).

Rob

P.S. It's pre-release polishing, the traditional time to give the todo list a quick scrub to see what comes out.
_______________________________________________
Toybox mailing list
[email protected]
http://lists.landley.net/listinfo.cgi/toybox-landley.net

Reply via email to