Command-line interface

From Wikipedia, the free encyclopedia
Jump to: navigation, search
Screenshot of a sample Bash session. GNOME Terminal 3, Fedora 15
Screenshot of a sample Bash session, taken on an old release of Gentoo Linux.
Screenshot of Apple Computer's CommandShell in A/UX 3.0.1.
Screenshot of Windows PowerShell 1.0, running under Windows Vista
The cmd.exe command-line interface in Windows 7
The Mac OS X Terminal

A command-line interface (CLI) is a means of interaction between a human user and a computer program, or between two programs, where the user (or client) passes commands in the form of a line of text (a command line) to a computer program.

The command-line interface evolved from a form of dialog once conducted by humans over teleprinter machines, in which human operators remotely exchanged information, usually one line of text at a time. Early computer systems often used teleprinter machines as the means of interaction with a human operator. The computer became one end of the human-to-human teleprinter model. So instead of a human communicating with another human over a teleprinter, a human communicated with a computer.

In time, the actual mechanical teleprinter was replaced by a glass tty (keyboard and screen, but emulating the teleprinter), and then by a terminal (where the computer software could address all of the screen, rather than only print successive lines).

Due to its text-based nature, a command-line interface is sometimes confused with the text-based user interface, a kind of user interface which uses only text, but not necessarily presented in successive lines. Text may be formatted and appear in fixed locations on a computer terminal display, as opposed to only appearing in successive lines.

The CLI was the primary means of human interaction with most early operating systems,[discuss] including MS-DOS, CP/M, Unix, and Apple DOS. The interface is usually implemented with a command line shell, which is a program that accepts commands as text input and converts commands to appropriate operating system functions.

Alternatives to the command line include, but are not limited to menus and various desktop metaphors centered on the pointer (usually controlled with a mouse).

Today, command-line interfaces to a computer operating system are less widely used by casual computer users, who favor graphical user interfaces.

Command-line interfaces are still often preferred by more advanced computer users, as they often provide a more concise and powerful means to control a program or operating system.

Programs with command-line interfaces are often much easier to automate via scripting.

Contents

 [hide

[edit] Operating System Command-Line Interfaces

Operating system command line interfaces are usually distinct programs supplied with the operating system.

A program that implements such a text interface is often called a command-line interpreter, command processor or shell. The term 'shell', often used to describe a command-line interpreter, can be in principle any program that constitutes the user-interface, including fully graphically oriented ones—for example, the default Windows GUI is created by a shell program named EXPLORER.EXE, as defined in the SHELL=EXPLORER.EXE line in the WIN.INI configuration file.

Examples of command-line interpreters include the various Unix shells (sh, ksh, csh, tcsh, bash, etc.), the historical CP/M CCP, and MS-DOS/IBM-DOS/DR-DOS's COMMAND.COM, as well as the OS/2 and the Windows CMD.EXE programs, the latter groups being based heavily on DEC's RSX and RSTS CLIs. Under most operating systems, it is possible to replace the default shell program by more specialized or powerful alternatives; some widespread examples include 4DOS for DOS, 4OS2 for OS/2, and 4NT or Take Command for Windows.

In November 2006, Microsoft released version 1.0 of Windows PowerShell (formerly codenamed Monad), which combined features of traditional Unix shells with their object-oriented .NET Framework. MinGW and Cygwin are open-source packages for Windows that offer a Unix-like CLI. Microsoft provides MKS Inc.'s ksh implementation MKS Korn shell for Windows through their Services for UNIX add-on.

The latest versions of the Macintosh operating system are based on a variation of Unix called Darwin. On these computers, users can access a Unix-like command-line interface called Terminal found in the Applications Utilities folder. (This terminal uses bash by default.)

Screenshot of the MATLAB 7.4 command-line interface and GUI.

[edit] Application Command-Line Interfaces

Application programs (as opposed to operating systems) may also have command line interfaces.

An application program may support none, any, or all of these three major types of command line interface mechanisms:

  1. Commands are specified as parameters upon invocation of the program.
    • Most operating systems support a means to pass additional information to a program when it is launched. When a program is launched from an OS command line shell, additional text provided at the shell command line along with the program name is passed to the launched program via command line arguments.
  2. Commands are entered via an interactive command line session controlled by the application.
    • After launch, a program may provide an operator with an independent means to enter commands in the form of text.
  3. Commands are entered via the operating system STDIN/STDOUT mechanism.

Some applications provide both a CLI and a GUI. In some cases, the GUI is a wrapper around a CLI application; other times, there is a CLI to control a GUI application. The engineering/scientific numerical computation package MATLAB provides no GUI for some calculations, but the CLI can handle any calculation. The three-dimensional-modelling program Rhinoceros 3D provides a CLI as well as a distinct scripting language. In some computing environments, such as the Oberon or Smalltalk user interface, most of the text which appears on the screen may be used for giving commands.

There are command-line interpreters for editing text files like ED and EDLIN, DEBUG, for disk management DISKPART, DFSEE, calculators (PC-DOS ACALC), all of which present a usable command prompt.

Some programs have the command line separate from the action window (where the output would appear). The early Sierra games, like KingsQuest 1-3, use commands from an internal command line to move the character around in the graphic window. Editors like Vi and IBM PC DOS E Editor use commands typed on the command line, switching back and forth to edit mode, a kind of graphical ED or EDLIN, as it were. (ED and EDLIN are pure teletype programs).

The Command-Line Interface continues to co-evolve with GUIs like those provided by Microsoft Windows, Mac OS and the X Window System. Programs that make use of external helper programs, often make use of command lines embedded in the GUI interface or configuration. In some applications, such as MATLAB, AutoCAD or EAGLE, a CLI is integrated with the GUI, with some benefits of both.

[edit] Usage

A CLI is used whenever a large vocabulary of commands or queries, coupled with a wide (or arbitrary) range of options, can be entered more rapidly as text than with a pure GUI. This is typically the case with operating system command shells. CLIs are also used by systems with insufficient resources to support a graphical user interface. Some computer language systems (such as Python, Forth, LISP and many dialects of BASIC) provide an interactive command-line mode to allow for experimentation.

CLIs are often used by programmers and system administrators, in engineering and scientific environments, and by technically advanced personal computer users. CLIs are also popular among people with visual disability, since the commands and responses can be displayed using Refreshable Braille displays.

[edit] Anatomy of a shell CLI

A CLI can generally be considered as consisting of syntax and semantics. The syntax is the grammar that all commands must follow. In the case of operating systems (OS), MS-DOS and Unix each define their own set of rules that all commands must follow. In the case of embedded systems, each vendor, such as Nortel, Juniper Networks or Cisco Systems, defines their own proprietary set of rules that all commands within their CLI conform to. These rules also dictate how a user navigates through the system of commands. The semantics define what sort of operations are possible, on what sort of data these operations can be performed, and how the grammar represents these operations and data—the symbolic meaning in the syntax.

Two different CLIs may agree on either syntax or semantics, but it is only when they agree on both that they can be considered sufficiently similar to allow users to use both CLIs without needing to learn anything, as well as to enable re-use of scripts.

A simple CLI will display a prompt, accept a "command line" typed by the user terminated by the Enter key, then execute the specified command and provide textual display of results or error messages. Advanced CLIs will validate, interpret and parameter-expand the command line before executing the specified command, and optionally capture or redirect its output.

Unlike a button or menu item in a GUI, a command line is typically self-documenting, stating exactly what the user wants done. In addition, command lines usually include many defaults that can be changed to customize the results. Useful command lines can be saved by assigning a character string or alias to represent the full command, or several commands can be grouped to perform a more complex sequence – for instance, compile the program, install it, and run it — creating a single entity, called a command procedure or script which itself can be treated as a command. These advantages mean that a user must figure out a complex command or series of commands only once, because they can be saved, to be used again.

The commands given to a CLI shell are often in one of the following forms:

  • doSomething how toFiles
  • doSomething how sourceFile destinationFile
  • doSomething how < inputFile > outputFile
  • doSomething how | doSomething how | do Something how > outputFile

where doSomething is, in effect, a verb, how an adverb (for example, should the command be executed "verbosely" or "quietly") and toFiles an object or objects (typically one or more files) on which the command should act. The '>' in the third example is a redirection operator, telling the command-line interpreter to send the output of the command not to the screen but to the file named on the right of the '>'. This will overwrite the file. Using '>>' will redirect the output and append it to the file. Another redirection operator is the vertical bar ('|'), which creates a pipeline where the output of one command becomes the input to the next command.

[edit] CLI and resource protection

A command interpreter running in an operating system, is bound by the same restrictions as any other program provides. These come from the operating system, file-system drivers, and network servers.

A command processor might provide further protection in preventing redirection overwriting files, or writing to invalid types. However, this is a feature of an individual program, and is not part of the interface.

One can modify the set of available commands, by modifying which paths appear in the PATH environment. Under UNIX, commands further need to have the 'x' attribute set to mark them as executable files. Since the path is searched for in order, by re-ordering the path, one can run eg \OS2\MDOS\E.EXE instead of \OS2\E.EXE, when the default is the opposite. Renaming of the executables also works: people often rename their favourite editor to EDIT, for example.

The command line does not have a 'heirachy of commands' outside of that provided by PATH. This is an idea associated with menu commands. Even the graphical user interface provides more commands than are present on the menu. The tools menu usually contains a command to edit the menus, button-bars, and hot-keys to alter the heirachy.

Both the command line and the GUI allow one to restrict available commands, such as access to advanced internal commands. The Windows CMD.EXE does this. Often, shareware programs will limit the range of commands, including greying out commands from use, or printing a command 'your administrator has disabled running batch files' from the prompt.

Although the command line interface does not provide for GUI features, one can add this to the console it runs under. BASICA for example, has a list of function keys at the bottom, each of which equates to typing the text at the prompt. There are programs that add buttons to the console in Windows, and alternate consoles, which do exactly the same thing (TCBUTTON in TCMD32, for example).

It might be noted that the interface, either command or graphic, can reduce access to available commands. For example, a number of GUI programs have an 'expert' mode, which makes more commands accessable from the menus. Also, the user can configure the menus to add or remove commands to menus, button bars etc.

[edit] Command prompt

A command prompt (or just prompt) is a sequence of (one or more) characters used in a command-line interface to indicate readiness to accept commands. Its intent is to literally prompt the user to take action. A prompt usually ends with one of the characters $, %, #, :, > and often includes other information, such as the path of the current working directory.

On many Unix system and derivative systems, it is common for the prompt to end in a $ or % character if the user is a normal user, but in a # character if the user is a superuser ("root" in Unix terminology).

It is common for prompts to be modifiable by the user. Depending on the environment, they may include colors, special characters, and other elements like variables and functions for the current time, user, shell number or working directory, in order, for instance, to make the prompt more informative or visually pleasing, to distinguish sessions on various machines, or to indicate the current level of nesting of commands. On some systems, special tokens in the definition of the prompt can be used to cause external programs to be called by the command-line interpreter while displaying the prompt.

In DOS's COMMAND.COM and in the Windows NT's command-line interpreter cmd.exe the prompt is modifiable by issuing a prompt command or by directly changing the value of the corresponding %PROMPT% environment variable. The default of most modern systems, the C:\> style is obtained, for instance, with "prompt $P$G". The default of older DOS systems, C> is obtained by just "prompt", although on some systems this produces the newer C:\> style, unless used on floppy drives A: or B:; on those systems "prompt $N$G" can be used to override the automatic default and explicitly switch to the older style.

On many Unix systems, the $PS1 variable can be used, although other variables also may have an impact on the prompt (depending on what shell is being used). In the bash shell, a prompt of the form

[time] user@host: work_dir $

could be set by issuing the command

export PS1='[\t] \u@\H: \W $'

In zsh the $RPROMPT variable controls an optional "prompt" on the right hand side of the display. It is not a real prompt in that the location of text entry does not change. It is used to display information on the same line as the prompt, but right justified.

In RISC OS, the command prompt is a '*' symbol, and thus (OS)CLI commands are often referred to as "star commands".[1] It is also possible to access the same commands from other command lines (such as the BBC BASIC command line), by preceding the command with a '*'.

[edit] Arguments

A command-line argument or parameter is an argument sent to a program being called. In principle a program can take many command-line arguments, the meaning and importance of which depend entirely upon the program.

When a command processor is active a program is typically invoked by typing its name followed by command-line arguments (if any). For example, in Unix and Unix-like environments, an example of a command-line argument is:

rm file.s

"file.s" is a command-line argument which tells the program rm to remove the file "file.s".

Some programming languages, such as C, C++ and Java, allow a program to interpret the command-line arguments by handling them as string parameters in the main function. Other languages, such as Python, expose these arguments as global variables.

[edit] Command-line option

A command-line option or simply option (also known as a flag or switch) modifies the operation of a command; the effect is determined by the command's program. Options follow the command name on the command line, separated by spaces. A space before the first option is not always required.

For example, in the OpenVMS operating system, the command directory is used to list the files inside a directory. By default—that is, when the user simply types directory—it will list only the names of the files. By appending the /owner option (to form the command directory/owner), the user can instruct the directory command to also display the ownership of the files.

The format of options varies widely between operating systems. In most cases the syntax is by convention rather than an operating system requirement; the entire command line is simply a string passed to a program, which can process it in any way the programmer wants.

Uniquely, in Multics, unique abbreviations are associated command-line options and subsystem keywords, an idea that appears to derive from the PL/I programming language with its shortened keywords (e.g., STRGE for STRINGRANGE and DCL for DECLARE). For example, in the Multics "forum" subsystem, the -long_subject parameter can be abbreviated -lgsj. It is also common for Multics commands to sport unique abbreviations, typically corresponding to the initial letters of the words that are strung together with underscores to form the commands' names, such as the use of did delete_iacl_dir.

Sometimes different programs use different syntax in the same operating system. For example:

  • Options may be indicated by -, /, or either.
  • They may or may not be case-sensitive.
  • Sometimes options and their arguments are run together, sometimes separated by whitespace, and sometimes by a character, typically : or =. Thus "Prog -fFilename", "Prog -f Filename", "Prog -f:Filename", "Prog -f=Filename".
  • Some programs allow single-character options to be combined; others do not. The switch "-fA" may mean the same as "-f -A", or it may be incorrect, or it may even be a valid but different parameter.

In Unix-like systems, the ASCII hyphen-minus is commonly used to specify options. The character is usually followed by one or more letters. An argument that is a single hyphen-minus by itself without any letters usually specifies that a program should handle data coming from the standard input or send data to the standard output. Two hyphen-minus characters ( -- ) are used on some programs to specify "long options" where more descriptive option names are used. This is a common feature of GNU software.

In DOS, OS/2 and Windows the forward slash ('/') is more prevalent, although the hyphen-minus is also sometimes used there. FlexOS, 4680 OS and 4690 OS use '-'. In many versions of DOS (MS-DOS/PC-DOS 2.xx and higher, all versions of DR-DOS since 5.0, as well as in PTS-DOS and FreeDOS) the current switch character to be used is defined by a value returned from a system call (INT 21/AH=37h). The default character returned by this API is '/', but can be changed to a hyphen-minus on all above-mentioned systems (except for MS-DOS/PC-DOS 5.0 and higher). In some of these systems (MS-DOS/PC-DOS 2.xx/3.xx, DR-DOS 7.02 and higher, and FreeDOS), the setting can not only be controlled by programs, but also pre-configured by a SWITCHAR directive in CONFIG.SYS. While applications should retrieve this setting before parsing command line arguments, many existing programs don't adhere to this standard and are hardwired to use '/' only. Under DR-DOS, if the setting has been changed from '/', the first directory separator '\' in the display of the PROMPT parameter $G will change to a forward slash '/' (also a valid directory separator in DOS, FlexOS, 4680 OS, 4690 OS, OS/2 and Windows) as a visual clue to indicate the change. Some command-line interpreters (including newer versions of DR-DOS COMMAND.COM and 4DOS) also provide pseudo-environment variables named %/% or %SWITCHAR% to allow portable batchjobs to be written.

It is impossible to know what arguments a program can recognise, and what syntax to use without consulting program documentation. It is usual for a program to display a brief summary of its parameters when invoked with a command-line which is typically one of: no parameters; ?; -?; -h; /?; /h; -help; or --help. Entering a program name without parameters in the hope that it will display parameters can be hazardous, as some programs and scripts execute without further ado.

[edit] The space character

In many areas of computing, but particularly in the command line, the space character can cause problems as it has two distinct and incompatible functions: as part of a command or parameter, or as a parameter or name separator. Ambiguity can be prevented either by prohibiting embedded spaces in file- and directory names in the first place (for example, by substituting them with underscores '_'), or, if supported by the command-line interpreter and the programs taking these parameters as arguments, by enclosing a name with embedded spaces between quote characters or using a escape character before the space, usually a backslash ('\'). For example

Long path/Long program name Parameter one Parameter two ...

is ambiguous (is "program name" part of the program name, or two parameters?); however

Long_path/Long_program_name Parameter_one Parameter_two ...,
LongPath/LongProgramName ParameterOne ParameterTwo ...,
"Long path/Long program name" "Parameter one" "Parameter two" ...

and

Long\ path/Long\ program\ name Parameter\ one Parameter\ two ...

are not ambiguous. Unix-based operating systems minimize the use of embedded spaces to minimize the need for quotes. In Microsoft Windows, one often has to use quotes because embedded spaces (such as in directory names) are common.

[edit] Command-line interpreter

The terms command-line interpreter, command line shell, command language interpreter, or identical abbreviation CLI, are applied to computer programs designed to interpret a sequence of lines of text which may be entered by a user, read from a file or another kind of data stream. The context of interpretation is usually one of a given operating system or programming language.

Command-line interpreters allow users to issue various commands in a very efficient (and often terse) way. This requires the user to know the names of the commands and their parameters, and the syntax of the language that is interpreted.

The unix /# and OS/2 EXTPROC commands facilitate the passing of batch files to external processors. One can use this to write specific command processors for dedicated uses, and process external data files which reside in batch files.

Many graphical interfaces, such as the OS/2 Presentation Manager and early versions of Microsoft Windows use command-lines to call helper programs to open documents and programs. The commands are stored in the graphical shell[clarification needed] or in files like the registry or the OS/2 os2user.ini file.

[edit] Early history

From the 1960s onwards, user interaction with computers was primarily by means of command-line interfaces, initially on machines like the Teletype Model 33 ASR, but then on early CRT-based computer terminals such as the VT52.

All of these devices were purely text based, with no ability to display graphic or pictures.[2] For business application programs, text-based menus were used, but for more general interaction the command line was the interface.

From the early 1970s the Unix operating system on minicomputers pioneered the concept of a powerful command-line environment, which Unix called the "shell", with the ability to "pipe" the output of one command in as input to another, and to save and re-run strings of commands as "shell scripts" which acted like custom commands.

The command-line was also the main interface for the early home computers such as the Commodore PET, Apple II and BBC Micro – almost always in the form of a BASIC interpreter. When more powerful business oriented microcomputers arrived with CP/M and later MSDOS computers such as the IBM PC, the command-line began to borrow some of the syntax and features of the Unix shells such as globbing and piping of output.

The command-line was first seriously challenged by the PARC GUI approach used in the 1983 Apple Lisa and the 1984 Apple Macintosh. The majority of IBM PC users did not replace their command.com shell with a GUI until Windows 95 was released in 1995.

[edit] Modern usage as an operating system shell

While most computer users now use a GUI almost exclusively, more advanced users have access to powerful command-line environments:

[edit] Scripting

Most command-line interpreters support scripting, to various extents. (They are, after all, interpreters of an interpreted programming language, albeit in many cases the language is unique to the particular command-line interpreter.) They will interpret scripts (variously termed shell scripts or batch files) written in the language that they interpret. Some command-line interpreters also incorporate the interpreter engines of other languages, such as REXX, in addition to their own, allowing the executing of scripts, in those languages, directly within the command-line interpreter itself.

Conversely, scripting programming languages, in particular those with an eval function (such as REXX, Perl, Python, Ruby or Jython), can be used to implement command-line interpreters and filters. For a few operating systems, most notably DOS, such a command interpreter provides a more flexible command line interface than the one supplied. In other cases, such a command interpreter can present a highly customised user interface employing the user interface and input/output facilities of the language.

[edit] Other Command-line interfaces

The command line provides an interface between programs as well as the user. In this sense, a command line is an alternative to a dialog. Editors and data-bases present a command line, in which alternate command processors might run. On the other hand, one might have options on the command line which opens a dialog box. The latest version of 'Take Command' has this feature. DBase used a dialog box to construct command lines, which could be further edited before use.

Programs like Basic, Diskpart, Edlin, and QBasic all provide command-line interfaces, some of which use the system shell. Basic is modeled on the default interface for 8-bit Intel computers. Calculators can be run as command-line or dialog interfaces.

There are a number of games from the pre-mouse games, (like Kings Quest 1-3), which relied on the user typing commands at the bottom of the screen. One controls the character by typing commands like 'get ring' or 'look'. The program returns a dialog which describes how the character sees it, or makes the action happen. The game 'h2g2' (hitchhiker's guide to the galaxy, based on Douglas Adam's book of the same name), is a teletype-style command-line game.

The most notable of these interfaces is the STDIO interface, which allows the output of one command to be passed to the input of another. Text files can serve either purpose as well. This provides the interfaces of piping, filters and redirection. Under Unix, devices are files too, so the normal type of file for the shell used for stdin,stdout and stderr is a tty device file.

Another command-line interface allows a shell program to launch helper programs, either to launch documents or start a program. The command is porcessed internally by the shell, and then passed on to another program to launch the document. The graphical interface of Windows and OS/2 rely heavily on command-lines passed through to other programs – console or graphical, which then usually process the command line without presenting a user-console.

Programs like the OS/2 E editor and some other IBM editors, can process command-lines normally meant for the shell, the output being placed directly in the document window.

One should remember that the 'address line' in a web browser is in fact a command line, even to the thing about about:blank interface. One can program extra commands for a web browser, say to open the registry at a given item, by using the reg: keyword.

On the other hand, features like command history and editing are not nesseccarily part of the command-line interface.

[edit] Quotes

Although most users think of the shell as an interactive command interpreter, it is really a programming language in which each statement runs a command. Because it must satisfy both the interactive and programming aspects of command execution, it is a strange language, shaped as much by history as by design.

Brian Kernighan & Rob Pike [9]

[edit] See also

[edit] References

  1. ^ RISC OS 3 User Guide, Part 3: Outside the desktop (page 125) Published by Acorn Computers Limited, ISBN 1-85250-124-2, Edition 2 Part number 0496,075 Issue 1 March 1992
  2. ^ With the exception of ASCII art
  3. ^ "Windows POSIX shell compatibility". http://technet.microsoft.com/en-us/library/cc754351.aspx. 
  4. ^ via Finder, Applications, Utilities, Terminal
  5. ^ "Android sh source". https://github.com/android/platform_system_core/tree/master/sh. 
  6. ^ "Android toolbox source". https://github.com/android/platform_system_core/tree/master/toolbox. 
  7. ^ "The Cisco IOS command-line interface (CLI) is the primary user interface..."
  8. ^ "...the software that you use whenever you access the router..."
  9. ^ Brian W. Kernighan and Rob Pike, "The UNIX Programming Environment", Prentice-Hall (1984).

[edit] External links

Personal tools
Namespaces

Variants
Actions
Navigation
Interaction
Toolbox
Print/export
Languages