- Running Commands
- Recalling Commands Using Command History
- Connecting and Expanding Commands
- Using Shell Variables
- Creating Your Shell Environment
- Getting Information about Commands
Understanding command syntax
Most commands have one or more options you can add to change the command's behavior. Options typically consist of a single letter, preceded by a hyphen. However, you can group single-letter options together or precede each with a hyphen, to use more than one option at a time. For example, the following two uses of options for the ls command are the same:
$ ls -l -a -t $ ls -lat
In both cases, the ls command is run with the -l (long listing), -a (show hidden dot files), and -t options (list by time).
Some commands include options that are represented by a whole word. To tell a command to use a whole word as an option, you typically precede it with a double hyphen (--). For example, to use the help option on many commands, you enter --help on the command line. Without the double hyphen, the letters h, e, l, and p would be interpreted as separate options. (There are some commands that don't follow the double hyphen convention, using a single hyphen before a word, but most commands use double hyphens for word options.)
Many commands also accept arguments after certain options are entered or at the end of the entire command line. An argument is an extra piece of information, such as a filename, directory, username, device, or other item that tells the command what to act on. For example, cat /etc/passwd displays the contents of the /etc/passwd file on your screen. In this case, /etc/passwd is the argument. Usually, you can have as many arguments as you want on the command line, limited only by the total number of characters allowed on a command line.
Sometimes, an argument is associated with an option. In that case, the argument must immediately follow the option. With single-letter options, the argument typically follows after a space. For full-word options, the argument often follows an equal sign (=). Here are some examples:
$ ls --hide=Desktop Documents Music Public Videos Downloads Pictures Templates
In the previous example, the --hide option tells the ls command to not display the file or directory named Desktop when listing the contents of the directory. Notice that the equal sign immediately follows the option (no space) and then the argument (again, no space).
Recalling Commands Using Command History
Being able to repeat a command you ran earlier in a shell session can be convenient. Recalling a long and complex command line that you mistyped can save you some trouble. Fortunately, some shell features enable you to recall previous command lines, edit those lines, or complete a partially typed command line.
The shell history is a list of the commands that you have entered before. Using the history command in a bash shell, you can view your previous commands. Then using various shell features, you can recall individual command lines from that list and change them however you please.
The rest of this section describes how to do command-line editing, how to complete parts of command lines, and how to recall and work with the history list.
After you type a command line, the entire command line is saved in your shell's history list. The list is stored in the current shell until you exit the shell. After that, it is written to a history file, from which any command can be recalled to run again at your next session. After a command is recalled, you can modify the command line, as described earlier.
To view your history list, use the history command. Type the command without options or followed by a number to list that many of the most recent commands. For example:
$ history 8 382 date 383 ls /usr/bin | sort -a | more 384 man sort 385 cd /usr/local/bin 386 man more 387 useradd -m /home/chris -u 101 chris 388 passwd chris 389 history 8
A number precedes each command line in the list. You can recall one of those commands using an exclamation point (!). Keep in mind that when using an exclamation point, the command runs blind, without presenting an opportunity to confirm the command you're referencing. There are several ways to run a command immediately from this list, including the following:
- !n—Run command number. Replace the n with the number of the command line and that line is run. For example, here's how to repeat the date command shown as command number 382 in the preceding history listing:
$ !382 dateWed Oct 29 21:30:06 PDT 2014
- !!—Run previous command. Runs the previous command line. Here's how you would immediately run that same date command:
$ !! dateWed Oct 29 21:30:39 PDT 2014
- !?string?—Run command containing string. This runs the most recent command that contains a particular string of characters. For example, you can run the date command again by just searching for part of that command line as follows:
$ !?dat? dateWed Oct 29 21:32:41 PDT 2014
Connecting and Expanding Commands
A truly powerful feature of the shell is the capability to redirect the input and output of commands to and from other commands and files. To allow commands to be strung together, the shell uses metacharacters. A metacharacter is a typed character that has special meaning to the shell for connecting commands or requesting expansion.
Metacharacters include the
pipe character (|), ampersand (&), semicolon (;), right parenthesis ( ) ), left parenthesis ( ( ), less than sign (<), and greater than sign (>). The next sections describe how to use metacharacters on the command line to change how commands behave.
Piping between commands
The pipe (|) metacharacter connects the output from one command to the input of another command. This lets you have one command work on some data and then have the next command deal with the results. Here is an example of a command line that includes pipes:
$ cat /etc/passwd | sort | less
This command lists the contents of the /etc/passwd file and pipes the output to the sort command. The sort command takes the usernames that begin each line of the /etc/passwd file, sorts them alphabetically, and pipes the output to the less command (to page through the output).
Sometimes, you may want a sequence of commands to run, with one command completing before the next command begins. You can do this by typing several commands on the same command line and separating them with semicolons (;):
$ date ; troff -me verylargedocument | lpr ; date
In this example, I was formatting a huge document and wanted to know how long it would take. The first command (date) showed the date and time before the formatting started. The troff command formatted the document and then piped the output to the printer. When the formatting was finished, the date and time were printed again (so I knew how long the troff command took to complete).
Another useful command to add to the end of a long command line is mail. You could add the following to the end of a command line.
; mail -s "Finished the long command" firstname.lastname@example.org
Then, for example, a mail message is sent to the user you choose after the command completes.
Some commands can take a while to complete. Sometimes, you may not want to tie up your shell waiting for a command to finish. In those cases, you can have the commands run in the background by using the ampersand (&).
Text formatting commands (such as nroff and troff, described earlier) are examples of commands that are often run in the background to format a large document. You also might want to create your own shell scripts that run in the background to check continuously for certain events to occur, such as the hard disk filling up or particular users logging in.
The following is an example of a command being run in the background:
$ troff -me verylargedocument | lpr &
Don't close the shell until the process is completed, or that kills the process.
With command substitution, you can have the output of a command interpreted by the shell instead of by the command itself. In this way, you can have the standard output of a command become an argument for another command. The two forms of command substitution are $(command) and
command (backticks, not single quotes).
The command in this case can include options, metacharacters, and arguments. The following is an example of using command substitution:
$ vi $(find /home | grep xyzzy)
In this example, the command substitution is done before the vi command is run. First, the find command starts at the /home directory and prints out all files and directories below that point in the filesystem. The output is piped to the grep command, which filters out all files except for those that include the string xyzzy in the filename. Finally, the vi command opens all filenames for editing (one at a time) that include xyzzy.
This particular example is useful if you want to edit a file for which you know the name but not the location. As long as the string is uncommon, you can find and open every instance of a filename existing beneath a point you choose in the filesystem.
Expanding arithmetic expressions
Sometimes, you want to pass arithmetic results to a command. There are two forms you can use to expand an arithmetic expression and pass it to the shell: $[expression] or $(expression). The following is an example:
$ echo "I am $[2015 - 1957] years old." I am 58 years old.
The shell interprets the arithmetic expression first (2015 - 1957) and then passes that information to the echo command. The echo command displays the text, with the results of the arithmetic (58) inserted.
Here's an example of the other form:
$ echo "There are $(ls | wc -w) files in this directory." There are 14 files in this directory.
This lists the contents of the current directory (ls) and runs the word count command to count the number of files found (wc -w). The resulting number (14, in this case) is echoed back with the rest of the sentence shown.
Variables that store information within the shell can be expanded using the dollar sign ($) metacharacter. When you expand an environment variable on a command line, the value of the variable is printed instead of the variable name itself, as follows:
$ ls -l $BASH -rwxr-xr-x 1 root root 1012808 Oct 8 08:53 /bin/bash
Using $BASH as an argument to ls -l causes a long listing of the bash command to be printed.
Using Shell Variables
The shell itself stores information that may be useful to the user's shell session in what are called variables. Examples of variables include $SHELL (which identifies the shell you are using), $PS1 (which defines your shell prompt), and $MAIL (which identifies the location of your mailbox).
You can see all variables set for your current shell by typing the set command. A subset of your local variables are referred to as environment variables. Environment variables are variables that are exported to any new shells opened from the current shell. Type env to see environment variables.
You can type echo $VALUE, where VALUE is replaced by the name of a particular environment variable you want to list. And because there are always multiple ways to do anything in Linux, you can also type declare to get a list of the current environment variables and their values along with a list of shell functions.
Besides those that you set yourself, system files set variables that store things such as locations of configuration files, mailboxes, and path directories. They can also store values for your shell prompts, the size of your history list, and type of operating system. You can refer to the value of any of those variables by preceding it with a dollar sign ($) and placing it anywhere on a command line. For example:
$ echo $USER chris
This command prints the value of the USER variable, which holds your username (chris). Substitute any other value for USER to print its value instead.
When you start a shell (by logging in via a virtual console or opening a Terminal window), many environment variables are already set. Table shows some variables that either are set when you use a bash shell or can be set by you to use with different features.
|BASH||This contains the full pathname of the bash command. This is usually /bin/bash.|
|BASH_VERSION||This is a number representing the current version of the bash command.|
|EUID||This is the effective user ID number of the current user. It is assigned when the shell starts, based on the user's entry in the /etc/passwd file.|
|FCEDIT||If set, this variable indicates the text editor used by the fc command to edit history commands. If this variable isn't set, the vi command is used.|
|HISTFILE||This is the location of your history file. It is typically located at $HOME/.bash_history.|
|HISTFILESIZE||This is the number of history entries that can be stored. After this number is reached, the oldest commands are discarded. The default value is 1000.|
|HISTCMD||This returns the number of the current command in the history list.|
|HOME||This is your home directory. It is your current working directory each time you log in or type the cd command with any options.|
|HOSTTYPE||This is a value that describes the computer architecture on which the Linux system is running. For Intel-compatible PCs, the value is i386, i486, i586, i686, or something like i386-linux. For AMD 64-bit machines, the value is x86_64.|
|This is the location of your mailbox file. The file is typically your username in the /var/spool/mail directory.|
|OLDPWD||This is the directory that was the working directory before you changed to the current working directory.|
|OSTYPE||This name identifies the current operating system. For Fedora Linux, the OSTYPE value is either linux or linux-gnu, depending on the type of shell you are using. (Bash can run on other operating systems as well.)|
|PATH||This is the colon-separated list of directories used to find commands that you type. The default value for regular users varies for different distributions, but typically includes the following: /bin:/usr/bin:/usr/local/bin:/usr/bin/X11:/usr/X11R6/bin:~/bin. You need to type the full path or a relative path to a command you want to run that is not in your PATH. For the root user, the value also includes /sbin, /usr/sbin, and /usr/local/sbin.|
|PPID||This is the process ID of the command that started the current shell (for example, the Terminal window containing the shell).|
|PROMPT_COMMAND||This can be set to a command name that is run each time before your shell prompt is displayed. Setting PROMPT_COMMAND=date lists the current date/time before the prompt appears.|
|PS1||This sets the value of your shell prompt. There are many items that you can read into your prompt (date, time, username, hostname, and so on). Sometimes a command requires additional prompts, which you can set with the variables PS2, PS3, and so on.|
|PWD||This is the directory that is assigned as your current directory. This value changes each time you change directories using the cd command.|
|RANDOM||Accessing this variable causes a random number to be generated. The number is between 0 and 99999.|
|SECONDS||This is the number of seconds since the time the shell was started.|
|SHLVL||This is the number of shell levels associated with the current shell session. When you log in to the shell, the SHLVL is 1. Each time you start a new bash command (by, for example, using su to become a new user, or by simply typing bash), this number is incremented.|
|TMOUT||This can be set to a number representing the number of seconds the shell can be idle without receiving input. After the number of seconds is reached, the shell exits. This security feature makes it less likely for unattended shells to be accessed by unauthorized people. (This must be set in the login shell for it to actually cause the shell to log out the user.)|
Creating and using aliases
Using the alias command, you can effectively create a shortcut to any command and options you want to run later. You can add and list aliases with the alias command. Consider the following examples of using alias from a bash shell:
$ alias p='pwd ; ls –CF' $ alias rm='rm -i'
In the first example, the letter p is assigned to run the command pwd, and then to run ls -CF to print the current working directory and list its contents in column form. The second example runs the rm command with the -i option each time you type rm. (This is an alias that is often set automatically for the root user. Instead of just removing files, you are prompted for each individual file removal. This prevents you from automatically removing all the files in a directory by mistakenly typing something such as rm *.)
While you are in the shell, you can check which aliases are set by typing the alias command. If you want to remove an alias, type unalias. (Remember that if the alias is set in a configuration file, it will be set again when you open another shell.)
Creating Your Shell Environment
You can tune your shell to help you work more efficiently. You can set aliases to create shortcuts to your favorite command lines and environment variables to store bits of information. By adding those settings to shell configuration files, you can have the settings available every time you open a shell.
Configuring your shell
Several configuration files support how your shell behaves. Some of the files are executed for every user and every shell, whereas others are specific to the user who creates the configuration file. Table shows the files that are of interest to anyone using the bash shell in Linux. (Notice the use of ~ in the filenames to indicate that the file is located in each user's home directory.)
|/etc/profile||This sets up user environment information for every user. It is executed when you first log in. This file provides values for your path, in addition to setting environment variables for such things as the location of your mailbox and the size of your history files. Finally, /etc/profile gathers shell settings from configuration files in the /etc/profile.d directory.|
|/etc/bashrc||This executes for every user who runs the bash shell, each time a bash shell is opened. It sets the default prompt and may add one or more aliases. Values in this file can be overridden by information in each user's ~/.bashrc file.|
|~/.bash_profile||This is used by each user to enter information that is specific to his or her use of the shell. It is executed only once, when the user logs in. By default, it sets a few environment variables and executes the user's .bashrc|
|~/.bashrc||This contains the information that is specific to your bash shells. It is read when you log in and also each time you open a new bash shell. This is the best location to add aliases so that your shell picks them up.|
|~/.bash_logout||This executes each time you log out (exit the last bash shell). By default, it simply clears your screen.|
Setting your prompt
Your prompt consists of a set of characters that appear each time the shell is ready to accept a command. The PS1 environment variable sets what the prompt contains and is what you interact with most of the time. If your shell requires additional input, it uses the values of PS2, PS3, and PS4.
When your Linux system is installed, often a prompt is set to contain more than just a dollar sign or pound sign. For example, in Fedora or Red Hat Enterprise Linux, your prompt is set to include the following information: your username, your hostname, and the base name of your current working directory. That information is surrounded by brackets and followed by a dollar sign (for regular users) or a pound sign (for the root user). The following is an example of that prompt:
If you change directories, the bin name would change to the name of the new directory. Likewise, if you were to log in as a different user or to a different host, that information would change.
You can use several special characters (indicated by adding a backslash to a variety of letters) to include different information in your prompt. Special characters can be used to output your terminal number, the date, and the time, as well as other pieces of information. Table provides some examples
|!||This shows the current command history number. This includes all previous commands stored for your username.|
|#||This shows the command number of the current command. This includes only the commands for the active shell.|
|\$||This shows the user prompt ($) or root prompt (#), depending on which user you are.|
|\W||This shows only the current working directory base name. For example, if the current working directory was /var/spool/mail, this value simply appears as mail.|
|[||This precedes a sequence of nonprinting characters. This can be used to add a terminal control sequence into the prompt for such things as changing colors, adding blink effects, or making characters bold. (Your terminal determines the exact sequences available.)|
|]||This follows a sequence of nonprinting characters.|
|\||This shows a backslash.|
|\d||This displays the day name, month, and day number of the current date—for example, Sat Jan 23.|
|\h||This shows the hostname of the computer running the shell.|
|\n||This causes a newline to occur.|
|\nnn||This shows the character that relates to the octal number replacing nnn.|
|\s||This displays the current shell name. For the bash shell, the value would be bash.|
|\t||This prints the current time in hours, minutes, and seconds—for example, 10:14:39.|
|\u||This prints your current username.|
|\w||This displays the full path to the current working directory.|
To make a change to your prompt permanent, add the value of PS1 to your .bashrc file in your home directory (assuming that you are using the bash shell). There may already be a PS1 value in that file that you can modify. Refer to the Bash Prompt HOWTO (http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO) for information on changing colors, commands, and other features of your bash shell prompt.
Adding environment variables
You might want to consider adding a few environment variables to your .bashrc file. These can help make working with the shell more efficient and effective:
- TMOUT—This sets how long the shell can be inactive before bash automatically exits. The value is the number of seconds for which the shell has not received input. This can be a nice security feature, in case you leave your desk while you are still logged in to Linux. To prevent being logged off while you are working, you may want to set the value to something like TMOUT=1800 (to allow 30 minutes of idle time). You can use any terminal session to close the current shell after a set number of seconds—for example, TMOUT=30.
PATH—As described earlier, the PATH variable sets the directories that are searched for commands you use. If you often use directories of commands that are not in your path, you can permanently add them. To do this, add a PATH variable to your .bashrc file. For example, to add a directory called /getstuff/bin, add the following:
PATH=$PATH:/getstuff/bin ; export PATH
This example first reads all the current path directories into the new PATH ($PATH), adds the /getstuff/bin directory, and then exports the new PATH.
WHATEVER—You can create your own environment variables to provide shortcuts in your work. Choose any name that is not being used and assign a useful value to it. For example, if you do lots of work with files in the /work/time/files/info/memos directory, you could set the following variable:
M=/work/time/files/info/memos ; export M
You could make that your current directory by typing cd
$M. You could run a program from that directory called hotdog by typing
$M/hotdog. You could edit a file from there called bun by typing vi
Getting Information about Commands
When you first start using the shell, it can be intimidating. All you see is a prompt. How do you know which commands are available, which options they use, or how to use advanced features? Fortunately, lots of help is available. Here are some places you can look to supplement what you learn in this chapter:
Check the PATH. Type echo $PATH. You see a list of the directories containing commands that are immediately accessible to you. Listing the contents of those directories displays most standard Linux commands. For example:
$ ls /bin arch dd fusermount loadkeys mv rnano awk df gawk login nano rpm basename dmesg gettext ls netstat rvi bash dnsdomainname grep lsblk nice rview cat domainname gtar lscgroup nisdomainname sed chgrp echo gunzip lssubsys ping setfont chmod ed gzip mail ping6 setserial chown egrep hostname mailx 0ps sh cp env ipcalc mkdir pwd sleep cpio ex kbd_mode mknod readlink sort csh false keyctl mktemp red stty cut fgrep kill more redhat_lsb_init su dash find link mount rm sync date findmnt ln mountpoint rmdir tar
- Use the help command. Some commands are built into the shell, so they do not appear in a directory. The help command lists those commands and shows options available with each of them. (Type help | less to page through the list.) For help with a particular built-in command, type help command, replacing command with the name that interests you. The help command works with the bash shell only.
- Use --help with the command. Many commands include a --help option that you can use to get information about how the command is used. For example, if you type date --help | less, the output shows not only options, but also time formats you can use with the date command. Other commands simply use a –h option, like fdisk -h.
- Use the info command. The info command is another tool for displaying information about commands from the shell. The info command can move among a hierarchy of nodes to find information about commands and other items. Not all commands have information available in the info database, but sometimes more information can be found there than on a man page.
- Use the man command. To learn more about a particular command, type man command. (Replace command with the command name you want.) A description of the command and its options appears on the screen.
Man pages are the most common means of getting information about commands, as well as other basic components of a Linux system. Each man page falls into one of the categories listed in Table. As a regular user, you will be most interested in man pages in section 1. As a system administrator, you will also be interested in sections 5 and 8, and occasionally section 4. Programmers will be interested in section 2 and 3 man pages.
|Section Number||Section Name||Description|
|1||User Commands||Commands that can be run from the shell by a regular user (typically no administrative privilege is needed)|
|2||System Calls||Programming functions used within an application to make calls to the kernel|
|3||C Library Functions||Programming functions that provide interfaces to specific programming libraries (such as those for certain graphical interfaces or other libraries that operate in user space)|
|4||Devices and Special Files||Filesystem nodes that represent hardware devices (such as terminals or CD drives) or software devices (such as random number generators)|
|5||File Formats and Conventions||Types of files (such as a graphics or word processing file) or specific configuration files (such as the passwd or group file)|
|6||Games||Games available on the system|
|7||Miscellaneous||Overviews of topics such as protocols, filesystems, character set standards, and so on|
|8||System Administration||Tools and Daemons Commands that require root or other administrative privileges to use|
Options to the man command enable you to search the man page database or display man pages on the screen. Here are some examples of man commands and options:
$ man -k passwd ... passwd (1) - update user's authentication tokens passwd (5) - password file $ man passwd $ man 5 passwd
Using the -k option, you can search the name and summary sections of all man pages installed on the system. About a dozen man pages include “passwd” in the name or description of a command. Let's say that the two man pages I am interested in are the passwd command (in section 1 of the man pages) and the passwd file (in section 5) man pages. Because just typing man passwd displays the section 1 page, I need to explicitly request the section 5 man page if I want to see that instead (man 5 passwd).
- Linux Bible 9th Edition Using the Shell