This is Gentoo's testing wiki. It is a non-operational environment and its textual content is outdated.

Please visit our production wiki at https://wiki.gentoo.org

Bash

From Gentoo Wiki (test)
Jump to:navigation Jump to:search

GNU Bash (Bourne-again shell) is the default shell on Gentoo systems and a popular shell program found on many Linux systems.

Installation

bash is part of the @system set and comes installed on every Gentoo system. It is also used by Portage, Gentoo's default package manager. It is highly recommended to not uninstall bash (or any other package in the @system set), even if another shell is used as a login-shell.

USE flags

It is possible to change USE flags:

USE flags for app-shells/bash The standard GNU Bourne again shell

afs Add OpenAFS support (distributed file system)
bashlogger Log ALL commands typed into bash; should ONLY be used in restricted environments such as honeypots
examples Install examples, usually source code
mem-scramble Build with custom malloc/free overwriting allocated/freed memory
net Enable /dev/tcp/host/port redirection
nls Add Native Language Support (using gettext - GNU locale utilities)
pgo Optimize the build using Profile Guided Optimization (PGO)
plugins Add support for loading builtins at runtime via 'enable'
readline Enable support for libreadline, a GNU line-editing library that almost everyone wants
static  !!do not set this during bootstrap!! Causes binaries to be statically linked instead of dynamically
verify-sig Verify upstream signatures on distfiles

After making USE modifications, ask Portage to update the system so the changes take effect:

root #emerge --ask --changed-use --deep @world

Configuration

Login shell

The default login shell for a user is defined in the /etc/passwd file. The login shell can be changed using the chsh utility, which is part of sys-apps/coreutils package.

Files

Many settings on how the shell behaves, can be defined via variables. Those variables are defined in several different configuration files, where the settings in the last file parsed do overwrite previous definitions.

  • /etc/profile - Initial settings for all users.
  • /home/USER/.bash_profile - Settings for this user.
  • /home/USER/.bash_login - Settings for this user, if /home/USER/.bash_profile doesn't exist
  • /home/USER/.profile - Settings for this user, if /home/USER/.bash_profile and /home/USER/.bash_login does not exist.

If the shell is started without login (e.g. in a terminal on a desktop), the following files are used:

  • /etc/bashrc - Initial settings for all users.
  • /home/USER/.bashrc - Settings for this user.

In Gentoo, and many other Linux distributions, the /etc/bashrc file is parsed in /etc/profile to ensure that /etc/bashrc and /home/USER/.bashrc are always checked when someone logs into the system. The final settings are defined by the user in their personal .bashrc file.

.bashrc

FILE ~/.bashrc
# configure PS1 command prompt
PS1='\u@\h \w \$ '

# no double entries in the shell history
export HISTCONTROL="$HISTCONTROL erasedups:ignoreboth"

# do not overwrite files when redirecting output by default.
set -o noclobber

# wrap these commands for interactive use to avoid accidental overwrites.
rm() { command rm -i "$@"; }
cp() { command cp -i "$@"; }
mv() { command mv -i "$@"; }

Tab completion

The app-shells/bash-completion package adds completion to many programs and their parameters. To enable completion, just merge the package. No special use flags for packages, which support completion, are required.

root #emerge --ask app-shells/bash-completion

Bash completion for all supported programs is enabled by default[1]. You can view the available completions with

user $eselect bashcomp list

and disable specific completions with

user $eselect bashcomp disable <command-name>

Usage

Environment variables

See all variables for the current shell process which have the export attribute set:

user $export

Of course, users can export their own variables, which are available to the current process and inherited by child processes:

user $export MYSTUFF=Hello

Environment variables can also be localized to an individual child process by prepending an assignment list to a simple command. The resulting environment passed to execve() will be the union of the assignment list with the environment of the calling shell process:

user $USE=kde emerge -pv libreoffice

To check the value of a variable:

user $typeset -p MYSTUFF

PS1

The special shell variable named PS1 defines what the terminal prompt looks like:

CODE Example prompt
MyUserName@MyPC: ~ $
Note
The ~ (tilde) symbol represents the current user's home directory (also represented by the HOME environment variable in bash).

This prompt would be the following value for the PS1 variable:

CODE PS1 definition
PS1="\u@\h \w $ "

The following table lists the possible placeholders that can be used in the PS1 variable:

Code Effect
\u Username.
\h Hostname.
\w Current directory.
\d Current date.
\t Current time.
\$ Indicate the root user with '#' and normal users with '$'.
\j Number of currently running tasks (jobs).

You can also put complete commands into your prompt using a command substitution. Here we want to execute cut -d\ -f1 /proc/loadavg to show the one-minute load average at the beginning of the prompt:

CODE PS1 definition
PS1="\$(cut -d\  -f1 /proc/loadavg) $ "

Looks like:

CODE Prompt
0.10 $

Having colors in the prompt:

CODE PS1 definition
PS1="\e[0;32m\]\u@\h \w >\e[0m\] "

The \e[0;32m\] changes the color for every next output, we have to put \e[0m\] at the end of our variable to reset the color, or we would type everything in green.

Color codes:

Code Color
\e[0;30m\] Black
\e[0;31m\] Red
\e[0;32m\] Green
\e[0;33m\] Yellow
\e[0;34m\] Blue
\e[0;35m\] Magenta
\e[0;36m\] Cyan
\e[0;37m\] White
\e[0m\] Reset to standard colors

The 0; in \e[0;31m\] means foreground. You can define other values like 1; for foreground bold and 4; for foreground underlined. Omit this number to refer to the background, e.g. \e[31m\].

set

The set command is used to display and change settings in the bash shell.

Show all current settings:

user $set -o

Disable the shell history:

user $set +o history

Enable the shell history:

user $set -o history

alias

You can use the alias builtin to define a new command or redefine an existing command:

user $alias ll='ls -l'

Whenever now ll (two lowercase Ls) is send to the shell, it will actually execute ls -l.

To remove an alias:

user $unalias ll
Note
No harm is done to the actual command being redefined.

If you want to temporarily bypass an alias you can escape the first letter of the command with a backslash character:

user $\ls

history

The history of used commands in a session is written to a file in the user's home directory. The easiest way to access the commands in the history is using the Up and Down keys.

To show all commands in the current history:

user $history

To search for commands in the history, by piping the output through grep and filter for words:

user $history | grep echo

The commands are numbered and can be executed using their index:

user $!2

To execute the last command used:

user $!!

Delete every command in the history:

user $history -c

Show the current settings for history:

user $echo $HISTCONTROL

Keyboard shortcuts

bash includes two different keyboard shortcuts modes to make editing input on the command-line easier: emacs mode and vi mode. bash defaults to emacs mode.

vi mode

vi mode requires an Esc key press to prefix very movement or edit, so it can be a bit awkward to learn this mode. To change the mode to vi mode, execute the following command:

user $set -o vi

Review this bash vi editing mode cheat sheet document by Peteris Krumins for more details on key bindings in vim mode.

emacs mode

To switch to emacs mode (which is the default mode):

user $set -o emacs

Movement:

Ctrl+a
Move the cursor to the beginning of the line (Home).
Ctrl+e
Move the cursor to the end of the line (End).
Ctrl+f
Move the cursor forward one character.
Ctrl+b
Move the cursor back one character.
Ctrl+xx
Toggle the cursor between the current position and the beginning of the line.

Screen control:

Ctrl+S
Stop (pause) output on the screen.
Ctrl+Q
Resume output on the screen (after stopping it with the previous command).
Ctrl+L
Clears the screen (very similar to the clear command).

Scripts

Shell scripts are text files which contain programs written in a certain shell scripting language. Which shell is used to interpret the commands in a script is defined in the first line (which is called the shebang):

FILE MyScript.sh
#!/bin/bash
echo 'Hello World!'

If no shell is defined the default shell for the user who executes the script is used. Often /bin/sh is used, which is the father of all shells and has very limited functionalities. Nearly all shells available understand commands used when running /bin/sh, so those scripts are highly portable.

Note
On many distributions /bin/sh is a symbolic link to /bin/bash. But on other distributions (like Debian) it can be a symbolic link to /bin/dash, which is a POSIX compliant variant of sh. In order to insure a good portability, be sure to test any script using the same shell than the one used in it's shebang.

Start scripts

To run scripts directly from the command-line, they need to be executable. To make a shell script executable:

user $chmod +x MyScript.sh

Now the script can be executed by using the ./ prefix, where either the shell defined by the shebang in the script or the default shell of the user is used:

user $./MyScript.sh

In alternative you can explicitly invoke the shell and pass the script filename as an argument (no change of permissions needed):

user $sh MyScript.sh

The file extension .sh does not matter, but it helps to distinguish scripts from normal text files.

Redirection

In Bash it is possible to redirect the output of one program into the input of another program using a pipe, indicated by the | symbol. This enables users to create command chains. Here is an example to redirect the output of ls -l into the program /usr/bin/less:

user $ls -l | less

To redirect output into a file:

user $ls -l > ls_l.txt

The > operator will erase any previous content before adding new one. If this is not desired, use the >> (append) operator instead.

Logical operators

Logical operators are very useful to chain commands together. This is helpful when checking if the previous command finished successfully or not.

&& (AND) - The following command prints 'Success' only if our test script is successful:

user $./MyScript.sh && echo 'Success'

|| (OR) - The following command prints 'Failure' only if our test script is unsuccessful:

user $./MyScript.sh || echo 'Failure'

Jobs

Usually if we start a script or command, the input is blocked until the command is finished. To start a program directly in the background, so we can continue to work in the shell:

user $sh MyScript.sh &

This will execute the script as job number 1 and the prompt expects the next input.

If a program is already running and you need to do something on the shell, it is possible to move programs from foreground to background and vice versa. To get a command prompt if a command is running on the shell, put it into sleep using Ctrl+Z, then move it to the background:

user $bg %1

To list all jobs running in the background:

user $jobs

To move a job back to foreground:

user $fg %1
Note
Programs running as jobs usually do not terminate once they finish execution, there will be a message if a job finished and bringing it to foreground will then terminate the program.

Command substitution

Using a command substitution, it is possible to run programs as parameters of other commands like here:

user $emerge $(qlist -CI x11-drivers)

This will first execute the command in the brackets and append the output as parameter of emerge.

Note
This command is quite useful in Gentoo to quickly rebuild all X11 drivers.

More substitutions can be performed in one command like this:

user $emerge $(qlist -CI x11-drivers) $(qlist -CI modules)

See also

  • shell - A command-line interpreter.
  • dash - The Debian Almquist Shell.

External resources

References

  1. News Items - bash-completion-2.1-r90, November 25th, 2014. Retrieved on May 13th, 2017.