[2024-feb-29] Sad news: Eric Layton aka Nocturnal Slacker aka vtel57 passed away on Feb 26th, shortly after hospitalization. He was one of our Wiki's most prominent admins. He will be missed.
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
slackbook:bash [2012/09/03 17:03 (UTC)] – added tags mfillpot | slackbook:bash [2012/10/14 15:52 (UTC)] (current) – removed all bash flags mfillpot | ||
---|---|---|---|
Line 4: | Line 4: | ||
===== What Is A Shell? ===== | ===== What Is A Shell? ===== | ||
- | Yeah, what exactly is a shell? Well, a shell is basically a command-line user environment. In essence, it is an application that runs when the user logs in and allows him to run additional applications. In some ways it is very similar to a graphical user interface, in that it provides a framework for executing commands and launching programs. There are many shells included with a full install of Slackware, but in this book we're only going to discuss bash(1), the Bourne Again Shell. Advanced users might want to consider using the powerful zsh(1), and users familiar with older UNIX systems might appreciate ksh. The truly masochistic might choose the csh, but new users should stick to bash. | + | Yeah, what exactly is a shell? |
+ | command-line user environment. | ||
+ | runs when the user logs in and allows him to run additional | ||
+ | applications. | ||
+ | interface, in that it provides a framework for executing commands and | ||
+ | launching programs. | ||
+ | of Slackware, but in this book we're only going to discuss | ||
+ | **//bash//**(1), the Bourne Again Shell. Advanced | ||
+ | users might want to consider using the powerful | ||
+ | **//zsh//**(1), and users familiar with older UNIX | ||
+ | systems might appreciate | ||
+ | masochistic might choose the **//csh//**, but new | ||
+ | users should stick to **//bash//**. | ||
===== Environment Variables ===== | ===== Environment Variables ===== | ||
- | All shells make certain tasks easier for the user by keeping track of things in environment variables. An environment variable is simply a shorter name for some bit of information that the user wishes to store and make use of later. For example, the environment variable PS1 tells bash how to format its prompt. Other variables may tell applications how to run. For example, the LESSOPEN variable tells less to run that handy lesspipe.sh preprocessor we talked about, and LS_OPTIONS tuns on color for ls. | + | All shells make certain tasks easier for the user by keeping track of |
+ | things in environment variables. | ||
+ | shorter name for some bit of information that the user wishes to store | ||
+ | and make use of later. | ||
+ | **//bash//** how to format its prompt. | ||
+ | variables may tell applications how to run. For example, the LESSOPEN | ||
+ | variable tells **//less//** to run that handy | ||
+ | '' | ||
+ | LS_OPTIONS tuns on color for **//ls//**. | ||
+ | |||
+ | |||
+ | Setting your own envirtonment variables is easy. | ||
+ | **// | ||
+ | handling this: **//set//** and | ||
+ | **// | ||
+ | variable can be removed by using **// | ||
+ | (Don't panic if you accidently unset an environment variable and don' | ||
+ | know what it would do. You can reset all the default variables by | ||
+ | logging out of your terminal and logging back in.) You can reference a | ||
+ | variable by placing a dollar sign ($) in front of it. | ||
- | Setting your own envirtonment variables is easy. bash includes two built-in functions for handling this: set and export. Additionally, | ||
< | < | ||
Line 18: | Line 47: | ||
</ | </ | ||
- | The primary difference between set and export is that export will (naturally) export the variable to any sub-shells. (A sub-shell is simply another shell running inside a parent shell.) You can easily see this behavior when working with the PS1 variable that controls the bash prompt. | + | |
+ | The primary difference between | ||
+ | **//export//** is that | ||
+ | **//export//** will (naturally) export the variable | ||
+ | to any sub-shells. | ||
+ | a parent shell.) | ||
+ | the PS1 variable that controls the **//bash//** | ||
+ | prompt. | ||
< | < | ||
Line 26: | Line 63: | ||
</ | </ | ||
- | There are many important environment variables that bash and other shells use, but one of the most important ones you will run across is PATH. PATH is simply a list of directories to search through for applications. For example, top(1) is located at / | + | |
+ | There are many important environment variables that | ||
+ | **//bash//** and other shells use, but one of the | ||
+ | most important ones you will run across is PATH. PATH is simply a list | ||
+ | of directories to search through for applications. | ||
+ | **//top//**(1) is located at | ||
+ | **/// | ||
+ | specifying the complete path to it, but if | ||
+ | '' | ||
+ | **//bash//** will check there if you don't specify a | ||
+ | complete path one your own. You will most likely first notice this | ||
+ | when you attempt to run a program that is not in your PATH as a normal | ||
+ | user, for instance, | ||
< | < | ||
Line 35: | Line 85: | ||
</ | </ | ||
- | Above, you see a typical PATH for a mortal user. You can change it on your own the same as any other environment variable. If you login as root however, you'll see that root has a different PATH. | + | |
+ | Above, you see a typical PATH for a mortal user. You can change it on | ||
+ | your own the same as any other environment variable. | ||
+ | root however, you'll see that root has a different PATH. | ||
< | < | ||
Line 43: | Line 97: | ||
/ | / | ||
</ | </ | ||
- | |||
===== Wildcards ===== | ===== Wildcards ===== | ||
- | Wildcards are special characters that tell the shell to match certain criteria. If you have experience with DOS, you'll recognize * as a wildcard that matches anything. bash makes use of this wildcard and several others to enable you to easily define exactly what you want to do. | + | Wildcards are special characters that tell the shell to match certain |
+ | criteria. | ||
+ | wildcard that matches anything. | ||
+ | use of this wildcard and several others to enable you to easily define | ||
+ | exactly what you want to do. | ||
+ | |||
+ | |||
+ | This first and most common of these is, of course, *. The asterisk | ||
+ | matches any character or combination of characters, including none. | ||
+ | Thus b* would match any files named b, ba, bab, | ||
+ | babc, bcdb, and so forth. | ||
+ | wildcard matches one instance of any character, so | ||
+ | b? would match ba and bb, but not b or bab. | ||
- | This first and most common of these is, of course, *. The asterisk matches any character or combination of characters, including none. Thus b* would match any files named b, ba, bab, babc, bcdb, and so forth. Slightly less common is the ?. This wildcard matches one instance of any character, so b? would match ba and bb, but not b or bab. | ||
< | < | ||
Line 58: | Line 122: | ||
</ | </ | ||
- | No, the fun doesn' | + | |
+ | No, the fun doesn' | ||
+ | the bracket pair //"[ ]"// which allows us to fine tune exactly what we | ||
+ | want to match. | ||
+ | bracket pair, it substitutes the contents of the bracket. | ||
+ | combination of letters or numbers may be specified in the bracket as | ||
+ | long as they are comma seperated. | ||
+ | letters may be specified as well. This is probably best shown by | ||
+ | example. | ||
< | < | ||
Line 65: | Line 138: | ||
</ | </ | ||
- | Since Linux is case-sensitive, | + | |
+ | Since Linux is case-sensitive, | ||
+ | treated differently. | ||
+ | letters in //" | ||
+ | lower-case letters, make sure to get them right. | ||
< | < | ||
Line 74: | Line 152: | ||
</ | </ | ||
- | In the second example, 1[b-W] isn't a valid range, so the shell treats it as a filename, and since that file doesn' | ||
+ | In the second example, 1[b-W] isn't a valid range, so the shell treats | ||
+ | it as a filename, and since that file doesn' | ||
+ | **//ls//** tells you so. | ||
===== Tab Completion ===== | ===== Tab Completion ===== | ||
- | Still think there' | + | Still think there' |
+ | wildcards? | ||
+ | dealing with long filenames: tab completion. | ||
+ | you to type just enough of the filename to uniquely identify it, then | ||
+ | by hitting the < | ||
+ | the rest for you. Even if you haven' | ||
+ | identify a filename, the shell will fill in as much as it can for you. | ||
+ | Hitting TAB a second time will make it display a list of all possible | ||
+ | matches for you. | ||
===== Input and Output Redirection ===== | ===== Input and Output Redirection ===== | ||
- | One of the defining features of Linux and other UNIX-like operating systems is the number of small, relatively simple applications and the ability to stack them together to create complex systems. This is achieved by redirecting the output of one program to another, or by drawing input from a file or second program. | + | One of the defining features of Linux and other UNIX-like operating |
+ | systems is the number of small, relatively simple applications and the | ||
+ | ability to stack them together to create complex systems. | ||
+ | achieved by redirecting the output of one program to another, or by | ||
+ | drawing input from a file or second program. | ||
+ | |||
+ | |||
+ | To get started, we're going to show you how to redirect the output of a | ||
+ | program to a file. This is easily done with the '>' | ||
+ | **// | ||
+ | all of the standard output (also known as stdout) to whatever file name | ||
+ | follows. | ||
- | To get started, we're going to show you how to redirect the output of a program to a file. This is easily done with the '>' | ||
< | < | ||
darkstar:~$ echo foo | darkstar:~$ echo foo | ||
Line 93: | Line 191: | ||
</ | </ | ||
- | In this example, we show you what echo would do if its stdout was not redirected to a file, then we re-direct it to the /tmp/bar file. If /tmp/bar does not exist, it is created and the output from echo is placed within it. If /tmp/bar did exist, then its contents are over-written. This might not be the best idea if you want to keep those contents in place. Thankfully, bash supports '>>' | + | |
+ | In this example, we show you what **//echo//** would | ||
+ | do if its stdout was not redirected to a file, then we re-direct it to | ||
+ | the '' | ||
+ | does not exist, it is created and the output from | ||
+ | **//echo//** is placed within it. If | ||
+ | '' | ||
+ | over-written. | ||
+ | those contents in place. | ||
+ | supports '>>' | ||
< | < | ||
Line 107: | Line 215: | ||
</ | </ | ||
- | You can also re-direct the standard error (or stderr) to a file. This is slightly different in that you must use ' | + | |
+ | You can also re-direct the standard error (or stderr) to a file. This | ||
+ | is slightly different in that you must use ' | ||
+ | (Since | ||
+ | stderr, each must be uniquely identifiable. | ||
+ | and 2 is stderr. | ||
+ | **//bash//** will make its best guess as to what you | ||
+ | actually meant, and assumed anytime you use '>' | ||
+ | redirect stdout. | ||
< | < | ||
Line 117: | Line 234: | ||
</ | </ | ||
- | You may also redirect the standard input (known as stdin) with the '<' | + | |
+ | You may also redirect the standard input (known as stdin) with the | ||
+ | '<' | ||
+ | character, though it's not used very often. | ||
< | < | ||
Line 123: | Line 244: | ||
</ | </ | ||
- | Finally, you can actually redirect the output of one program as input to another. This is perhaps the most useful feature of bash and other shells, and is accomplished using the ' | + | |
+ | Finally, you can actually redirect the output of one program as input | ||
+ | to another. | ||
+ | **//bash//** and other shells, and is accomplished | ||
+ | using the ' | ||
+ | If you here some one talk of piping one program to another, this is | ||
+ | exactly what they mean.) | ||
< | < | ||
Line 133: | Line 261: | ||
root 3202 0.0 0.0 | root 3202 0.0 0.0 | ||
</ | </ | ||
- | |||
===== Task Management ===== | ===== Task Management ===== | ||
- | bash has yet another cool feature to offer, the ability to suspend and resume tasks. This allows you to temporarily halt a running process, perform some other task, then resume it or optionally make it run in the background. Upon pressing CTRL-Z, bash will suspend the running process and return you to a prompt. You can return to that process later. Additionally, | + | **//bash//** has yet another cool feature to offer, |
+ | the ability to suspend and resume tasks. | ||
+ | temporarily halt a running process, perform some other task, then | ||
+ | resume it or optionally make it run in the background. Upon pressing | ||
+ | < | ||
+ | the running process and return you to a prompt. You can return to that | ||
+ | process later. | ||
+ | this way indefinitely. | ||
+ | command will display a list of suspended tasks. | ||
< | < | ||
Line 144: | Line 280: | ||
</ | </ | ||
- | In order to return to a suspended task, run the fg built-in to bring the the most recently suspended task back into the foreground. If you have mutiple suspended tasks, you can specify a number as well to bring one of them to the foreground. | + | |
+ | In order to return to a suspended task, run the | ||
+ | **//fg//** built-in to bring the the most recently | ||
+ | suspended task back into the foreground. If you have mutiple suspended | ||
+ | tasks, you can specify a number as well to bring one of them to the | ||
+ | foreground. | ||
< | < | ||
Line 151: | Line 293: | ||
</ | </ | ||
- | You can also background a task with (surprize) bg. This will allow the process to continue running without maintaining control of your shell. You can bring it back to the foreground with fg in the same way as suspended tasks. | + | |
+ | You can also background a task with (surprize) | ||
+ | **//bg//**. This will allow the process to continue | ||
+ | running without maintaining control of your shell. You can bring it | ||
+ | back to the foreground with **//fg//** in the same | ||
+ | way as suspended tasks. | ||
===== Terminals ===== | ===== Terminals ===== | ||
- | Slackware Linux and other UNIX-like operating systems allow users to interact with them in many ways, but the most common, and arguably the most useful, is the terminal. In the old days, terminals were keyboards and monitors (sometimes even mice) wired into a mainframe or server via serial connections. Today however, most terminals are virtual; that is, they exist only in software. Virtual terminals allow users to connect to the computer without requiring expensive and often incompatible hardware. Rather, a user needs only to run the software and they are presented with a (usually) highly customizable virtual terminal. | + | Slackware Linux and other UNIX-like operating systems allow users to |
+ | interact with them in many ways, but the most common, and arguably the | ||
+ | most useful, is the terminal. In the old days, terminals were keyboards | ||
+ | and monitors (sometimes even mice) wired into a mainframe or server via | ||
+ | serial connections. Today however, most terminals are virtual; that is, | ||
+ | they exist only in software. | ||
+ | to the computer without requiring expensive and often incompatible | ||
+ | hardware. Rather, a user needs only to run the software and they are | ||
+ | presented with a (usually) highly customizable virtual terminal. | ||
- | The most common virtual terminals (in that every Slackware Linux machine is going to have at least one) are the gettys. agetty(8) runs six instances by default on Slackware, and allows local users (those who can physically sit down in front of the computer and type at the keyboard) to login and run applications. Each of these gettys is available on different tty devices that are accessible seperately by pressing the **ALT** key and one of the function keys from **F1** through **F6**. Using these gettys allows you to login multiple times, perhaps as different users, and run applications in those users' shells silmutaneously. This is most commonly done with servers which do not have X installed, but can be done on any machine. | ||
- | On desktops, laptops, and other workstations where the user prefers a graphical interface provided by X, most terminals are graphical. Slackware | + | The most common virtual |
+ | is going to have at least one) are the gettys. | ||
+ | **// | ||
+ | Slackware, | ||
+ | front of the computer and type at the keyboard) to login and run | ||
+ | applications. Each of these gettys is available on different tty | ||
+ | devices that are accessible seperately by pressing the | ||
+ | <key>'ALT'</ | ||
+ | < | ||
+ | allows | ||
+ | applications | ||
+ | commonly done with servers which do not have | ||
+ | **//X//** installed, but can be done on any machine. | ||
+ | |||
+ | On desktops, laptops, and other workstations where the user prefers a | ||
+ | graphical interface provided by **//X//**, most | ||
+ | terminals are graphical. | ||
+ | terminals, but the most commonly used are KDE's | ||
+ | **// | ||
+ | **// | ||
+ | xterm(1). If you are using a graphical interface, check your tool bars | ||
+ | or menus. Each desktop environment or window manager has a virtual | ||
+ | terminal (often called a terminal emulater), and they are all labelled | ||
+ | differently. Typically though, you will find them under a //" | ||
+ | sub-menu in desktop environments. Executing any of these will give you | ||
+ | a graphical terminal and automatically run your default shell. | ||
===== Customization ===== | ===== Customization ===== | ||
- | By now you should be pretty familiar with bash and you may have even noticed some odd behavior. For example, when you login at the console, you're presented with a prompt that looks a bit like this. | + | By now you should be pretty familiar with |
+ | **//bash//** and you may have even noticed some odd | ||
+ | behavior. For example, when you login at the console, you're presented | ||
+ | with a prompt that looks a bit like this. | ||
< | < | ||
- | alan@darkstar: | + | alan@darkstar: |
- | </ | + | |
However, sometimes you'll see a much less helpful prompt like this one. | However, sometimes you'll see a much less helpful prompt like this one. | ||
+ | |||
< | < | ||
- | bash-3.1$ | + | bash-3.1$ </ |
- | </ | + | |
+ | |||
+ | The cause here is a special environment variable that controls the | ||
+ | **// | ||
+ | //" | ||
+ | different configuration files when started. Login shells read | ||
+ | ''/ | ||
+ | '' | ||
+ | read '' | ||
+ | for power users, but is a common annoyance for many new users who want | ||
+ | the same environment anytime they execute | ||
+ | **// | ||
+ | between login and interactive shells. If this applies to you, simply | ||
+ | edit your own ~/.bashrc file and include the following lines. | ||
+ | (For more information on | ||
+ | the different configuration files used, read the INVOCATION section of | ||
+ | the **// | ||
- | The cause here is a special environment variable that controls the bash prompt. Some shells are considered " | ||
< | < | ||
+ | |||
# ~/.bashrc | # ~/.bashrc | ||
. / | . / | ||
Line 182: | Line 383: | ||
</ | </ | ||
- | When using the above, all your login and interactive shells will have the same environment settings and behave identically. Now, anytime we wish to customize a shell setting, we only have to edit ~/ | ||
- | bash prompts come in all shapes, colors, and sizes, and every user has their own preferances. Personally, I prefer short and simple prompts that take up a minimum of space, but I've seen and used mutli-line prompts many times. One personal friend of mine even included ASCII-art in his bash prompt. To change your prompt you need only to change your PS1 variable. By default, Slackware attempts to configure your PS1 variable thusly: | + | When using the above, all your login and interactive shells will have |
+ | the same environment settings and behave identically. Now, anytime we | ||
+ | wish to customize a shell setting, we only have to edit | ||
+ | '' | ||
+ | ''/ | ||
+ | configuring the prompt. | ||
+ | |||
+ | |||
+ | **//bash//** prompts come in all shapes, colors, and | ||
+ | sizes, and every user has their own preferances. Personally, I prefer | ||
+ | short and simple prompts that take up a minimum of space, but I've seen | ||
+ | and used mutli-line prompts many times. One personal friend of mine | ||
+ | even included ASCII-art in his bash prompt. To change your prompt you | ||
+ | need only to change your PS1 variable. By default, Slackware attempts | ||
+ | to configure your PS1 variable thusly: | ||
< | < | ||
darkstar:~$ echo $PS1 | darkstar:~$ echo $PS1 | ||
- | \u@\h: | + | \u@\h:\w\$ </ |
- | </ | + | |
- | Yes, this tiny piece of funny-looking figures controls your bash prompt. Basicaly, every character in the PS1 variable is included in the prompt, unless it is a escaped by a \, which tells bash to interpret it. There are many different escape sequences and we can't discuss them all, but I'll explain these. The first " | ||
- | Since we've gone through all this trouble to discuss the default prompt, I thought I'd take some time to show you a couple example prompts and the PS1 variable values needed to use them. | + | Yes, this tiny piece of funny-looking figures controls your |
+ | **// | ||
+ | the PS1 variable is included in the prompt, unless it is a escaped by a | ||
+ | < | ||
+ | interpret it. There are many different escape sequences and we can' | ||
+ | discuss them all, but I'll explain these. | ||
+ | the username of the current user. //" | ||
+ | the terminal is attached to. //" | ||
+ | //" | ||
+ | depending on whether or not the current user is root. A complete | ||
+ | listing of all prompt escape sequences is listed in the | ||
+ | **// | ||
+ | |||
+ | |||
+ | Since we've gone through all this trouble to discuss the default | ||
+ | prompt, I thought I'd take some time to show you a couple example | ||
+ | prompts and the PS1 variable values needed to use them. | ||
< | < | ||
Line 204: | Line 434: | ||
</ | </ | ||
- | For even more information on configuring your bash prompt, including information on setting up colored prompts, refer to / | ||
+ | For even more information on configuring your bash prompt, including | ||
+ | information on setting up colored prompts, refer to | ||
+ | ''/ | ||
+ | reading that for a short while, you'll get an idea of just how powerful | ||
+ | your **// | ||
+ | prompt that gave me up to date weather information such as temperature | ||
+ | and barometric pressure! | ||
+ | |||
+ | ====== Chapter Navigation ====== | ||
+ | |||
+ | **Previous Chapter: [[slackbook: | ||
+ | |||
+ | **Next Chapter: [[slackbook: | ||
====== Sources ====== | ====== Sources ====== | ||
<!-- If you copy information from another source, then specify that source --> | <!-- If you copy information from another source, then specify that source --> | ||
- | * Original source: [[http:// | + | |
<!-- Authors are allowed to give credit to themselves! --> | <!-- Authors are allowed to give credit to themselves! --> | ||
- | < | + | |
<!-- * Contrbutions by [[wiki: | <!-- * Contrbutions by [[wiki: | ||