---
Speaking from an experience writing CLIs for configuration-heavy embedded devices, the key design element of a functional CLI is a context-aware TAB expansion. This is what makes a CLI truly convenient for routine use.
For example, if a mysql shell was smarter, it would've been allowing this:
> use p<tab><enter> expands to "use production"
> show c<tab> s<tab><tab><enter> expands to "show columns from secondary"
> select * f<tab> s<tab><tab> ... expands to "select * from secondary ..."
It would also be nice to make OS shell more aware of individual commands' options, and to allow for example: # ip addr <tab> shows "ip addr add"
# <tab> shows "ip addr del"
# <tab> shows "ip addr"
This is possible through hardcoding these expansions into the shell, but that's not very elegant, is it? On the other hand allowing to integrate arbitrary commands with the shell in a generic way would require putting together some sort of interface/manifest contraption and it would most likely go against the very spirit of Unix simplicity. So catch 22 it is.