Configuring Shell Environment
1. Understanding Shell Configuration Files
| File | Scope | When Loaded | Notes |
|---|---|---|---|
| /etc/profile | System-wide | On login | Global settings for all users |
| ~/.bashrc | User-specific | On interactive shell startup | Per-user shell settings, aliases, functions |
| ~/.bash_profile | User-specific | On login | Overrides /etc/profile for login shells |
| ~/.bash_login | User-specific | On login | Loaded if ~/.bash_profile doesn't exist |
| ~/.profile | User-specific | On login | Used by POSIX-compliant shells (e.g., dash) |
Example: Setting Environment Variables in ~/.bashrc
export PATH="$PATH:/home/user/bin"
export EDITOR=vim
export LANG=en_US.UTF-8
Note: Changes to
~/.bashrc take effect in new shells or after running source ~/.bashrc.2. Setting Shell Prompt
| Variable | Default Value | Description |
|---|---|---|
| PS1 | \u@\h:\w\$ |
Primary prompt string, displayed before each command |
| PS2 | > |
Secondary prompt string, used for multi-line commands |
Note: The prompt variables support escape sequences. Common ones include
\u (username), \h (hostname), and \w (current working directory).3. Creating Command Aliases
| Alias Name | Command | Description |
|---|---|---|
| ll | ls -la |
List all files with detailed info |
| grep | grep --color=auto |
Highlight matches in output |
| cls | clear |
Clear terminal screen |
Example: Define alias in .bashrc
# Add to ~/.bashrc
alias ll='ls -la'
alias grep='grep --color=auto'
alias cls='clear'
# Reload config
source ~/.bashrc
Note: Aliases are expanded before command execution and do not support arguments.
Warning: Avoid aliasing commands that are part of shell built-ins (e.g.,
cd, echo) as it may cause unexpected behavior.4. Defining Shell Functions
| Function Type | Syntax | Description |
|---|---|---|
| Bash Function | function_name() { commands; } |
Standard bash function definition using curly braces |
| Bash Function (Alternative) | function_name { commands; } |
Alternative syntax without parentheses |
| Bash Function with Parameters | greet() { echo "Hello, $1!"; } |
Function accepting positional parameters |
| Bash Function with Return Value | get_date() { echo "$(date)"; } |
Function returning output via echo |
| Bash Function with Local Variables | local_var() { local var="value"; echo "$var"; } |
Using local to scope variables |
Example: Function with Parameters and Return Value
calculate() {
local a=$1
local b=$2
echo $((a + b))
}
result=$(calculate 5 3)
echo "Sum is: $result"
Note: Functions defined in shell scripts are available to all subsequent commands in that script's scope.
Warning: Avoid defining functions inside loops or conditionals unless necessary, as it can impact performance.
5. Configuring Command History
| Setting | Default Value | Description |
|---|---|---|
| HISTSIZE | 500 |
Number of commands to save in the command history list |
| HISTFILESIZE | 500 |
Number of commands to save in the history file |
| HISTIGNORE | "" |
Commands to ignore when adding to history (e.g. "ls:pwd") |
| HISTTIMEFORMAT | "" |
Format for timestamp in history output (e.g. "%Y-%m-%d %H:%M:%S ") |
| HISTCONTROL | ignoredups |
Controls how commands are saved to history (e.g. ignorespace, erasedups) |
Note: Changes to history settings only affect new shells. To apply changes in the current shell, run
export or reload the configuration file.
6. Using History Command
| Command | Description | Example |
|---|---|---|
| history | Displays command history | history |
| !n | Re-executes command at line number n | !5 |
| !! | Re-executes last command | !! |
| !string | Re-executes last command starting with string | !ls |
| !$ | Re-executes last argument of previous command | echo !$ |
Example: Re-executing last command
$ echo "Hello World"
Hello World
$ !!
echo "Hello World"
Hello World
7. Searching Command History
| Command | Description | Usage |
|---|---|---|
| history | Displays command history | history |
| !! | Re-executes last command | !! |
| !n | Re-executes command at line n | !5 |
| !string | Re-executes last command starting with string | !ls |
| !$ | Re-executes last argument of previous command | !$ |
Example: Using !string to re-execute command
ls -la
total 24
drwxr-xr-x 3 user user 4096 Apr 1 12:00 .
drwxr-xr-x 5 user user 4096 Apr 1 11:00 ..
-rw-r--r-- 1 user user 24 Apr 1 12:00 file.txt
ls -la
total 24
drwxr-xr-x 3 user user 4096 Apr 1 12:00 .
drwxr-xr-x 5 user user 4096 Apr 1 11:00 ..
-rw-r--r-- 1 user user 24 Apr 1 12:00 file.txt
!ls
8. Configuring Auto-Completion
| Shell | Configuration File | Auto-Completion Setup |
|---|---|---|
| Bash | ~/.bashrc |
Add source /etc/bash_completion or source <completion_script> |
| Zsh | ~/.zshrc |
Enable with autoload -Uz compinit && compinit |
Example: Bash Auto-Completion Setup
echo "source /etc/bash_completion" >> ~/.bashrc
source ~/.bashrc
Example: Zsh Auto-Completion Setup
echo "autoload -Uz compinit && compinit" >> ~/.zshrc
source ~/.zshrc
Note: Bash completion scripts are usually installed in
/etc/bash_completion.d/. Zsh uses the zsh-completions package.
| Feature | Bash | Zsh |
|---|---|---|
| Default Completion | Basic file and command completion | Advanced file, command, and parameter completion |
| Plugin Support | Requires external packages (e.g., bash-completion) |
Natively supports plugins via zsh-completions |
| Configuration | Manual setup in .bashrc |
Automatic loading via compinit |
9. Setting Default Editor
| Method | Description | Example |
|---|---|---|
| EDITOR | Environment variable to set the default editor for commands like git commit |
export EDITOR=vim |
| VISUAL | Environment variable for a full-screen editor, often used by tools like crontab -e |
export VISUAL=nano |
| SHELL | Shell used to execute commands; affects editor behavior in some tools | export SHELL=/bin/bash |
Note: The
EDITOR variable is typically used by Git and other tools that require an editor for interactive input.
Warning: Ensure the editor specified is installed and accessible in your
$PATH.
10. Changing Default Shell
| Method | Description | Usage |
|---|---|---|
| chsh | Changes the user's login shell | chsh -s /bin/bash |
| /etc/passwd | File containing user shell information | Edit manually with sudo vim /etc/passwd |
| getent | Retrieves user information including shell | getent passwd username |
Note: The new shell must be listed in
/etc/shells to be accepted by chsh.Warning: Changing the default shell can affect how scripts and programs behave if they rely on specific shell features.
11. Using Shell Options
| Option | Description | Usage |
|---|---|---|
| -a | Enable alias expansion | set -a |
| -b | Notify immediately when background jobs terminate | set -b |
| -e | Exit immediately if a command exits with a non-zero status | set -e |
| -u | Exit when referencing an unset variable | set -u |
| -x | Print commands and their arguments as they are executed (debug mode) | set -x |
Example: Enabling Debug Mode
set -x
echo "Debug mode enabled"
ls -la
set +x
echo "Debug mode disabled"
Note: The
-x option is useful for debugging shell scripts.