As noted above, this format:
[master verb] [subverb] [optionally, noun] [options]
good in terms of remembering which commands are available. cvs, svn, perforce, git all adhere to this. This improves command detection capabilities, which is a major CLI issue. One wrinkle that arises here is the options for the verb master-verb versus the options for subverb. Ie
cvs -d dir command bar
differs from
cvs command -d dir bar
It was a confusing situation in cvs, which svn “fixed”, allowing parameters specified in any order. Your own decision may vary; if you have a very good reason to pass parameters to the master verb, well, just know about the service data.
Look for usability of the API is also a good idea, but be careful that there is no real typing in the CLI commands, and there is a lot of wealth in which CLI commands are “returned” because you have a return code and exit to work. In the unixy / streams world, output is usually much more important than a return code. Getting the format of your exit right is crucial. Also, although I was seduced, I found that sending different things to stdout vs. stderr is not always useful; this confuses beginners and even intermediate users (because in most cases they are reset to the console) and are rarely useful advanced users. Therefore, if there is no real need, I avoid it; it is too easy for (for example) someone to be very embarrassed why the output of the command was “in error condition” only because the programmer perfectly dumped errors in stderr.
Another design issue is the “what's next” problem. In the graphical interface, the following steps for the user are determined by the available buttons, menus, etc. In the CLI, the user can literally enter any next command and pass any command to any other. (Or try, at least.) I develop my teams to give hints (either in help or in the output) about what potential next steps might be in a typical workflow.
Another good template allows the user to customize the output. Although users can use cut , sort , etc., to adapt the output, the ability to specify a format string increases the usefulness of the command. The example here is top , which allows you to specify which columns you need.