Skip to content

Shell - Basic Setup

Essential shell configuration for a productive Unix environment.

File Creation Permissions

Set umask

Control file creation permissions to ensure security:

# Set umask to 0007
# This makes new files group-writable but not world-readable
umask 0007

What this does: - 0007 sets permissions to u=rwx, g=rwx, o=--- - Files created are 660 (rw-rw----) - Directories created are 770 (rwxrwx----) - Group members can read/write, others cannot access - Balances security with team collaboration

Add this early in your shell profile (.bashrc or .zshrc).

PATH Configuration

Organize Your PATH

Properly structure your PATH for predictable binary resolution:

# User-local binaries (takes precedence)
export PATH="$HOME/.local/bin:$PATH"

# Traditional user bin directory
export PATH="$PATH:$HOME/bin"

# Cargo binaries (Rust)
export PATH="$PATH:$HOME/.cargo/bin"

Order matters: - ~/.local/bin first - User-installed tools take precedence - System PATH in middle - Standard locations - ~/bin last - Legacy user directory - ~/.cargo/bin last - Rust binaries

Set Micromamba as Default Conda

If using micromamba for environment management:

# Set micromamba as default conda
export CONDA_EXE="$(command -v micromamba)"
export MAMBA_EXE="${CONDA_EXE}"

Rootless Container Configuration

Podman/Docker Support

For rootless Podman or Docker:

# Set runtime directory for rootless containers
export XDG_RUNTIME_DIR="/run/user/$(id -u)"

# Alias docker to podman if available
if command -v podman &> /dev/null; then
    alias docker='podman'
fi

Why this matters: - Allows running containers without root privileges - XDG_RUNTIME_DIR provides runtime file storage - docker=podman alias simplifies workflow if migrating from Docker

Shell Profile Setup

Bash Configuration

Edit ~/.bashrc:

# File creation permissions
umask 0007

# PATH Configuration
export PATH="$HOME/.local/bin:$PATH"
export PATH="$PATH:$HOME/bin"
export PATH="$PATH:$HOME/.cargo/bin"

# Set default editor
export EDITOR=vim
export GIT_EDITOR=vim

# Language
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

# Conda/Micromamba
export CONDA_EXE="$(command -v micromamba)"

# Rootless container support
export XDG_RUNTIME_DIR="/run/user/$(id -u)"

# Container aliases
if command -v podman &> /dev/null; then
    alias docker='podman'
fi

# SSH Keychain (skip in Slurm PTY)
if [[ -z "$SLURM_PTY_PORT" ]]; then
    eval $(~/.local/bin/keychain --quiet --eval id_ed25519)
fi

# Add useful aliases
alias ll='ls -lah'
alias cd..='cd ..'
alias clear-cache='rm -rf ~/.cache'

Zsh Configuration

Edit ~/.zshrc:

# File creation permissions
umask 0007

# PATH Configuration
export PATH="$HOME/.local/bin:$PATH"
export PATH="$PATH:$HOME/bin"
export PATH="$PATH:$HOME/.cargo/bin"

# Set default editor
export EDITOR=vim
export GIT_EDITOR=vim

# Language
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

# Conda/Micromamba
export CONDA_EXE="$(command -v micromamba)"

# Rootless container support
export XDG_RUNTIME_DIR="/run/user/$(id -u)"

# Container aliases
if command -v podman &> /dev/null; then
    alias docker='podman'
fi

# SSH Keychain (skip in Slurm PTY)
if [[ -z "$SLURM_PTY_PORT" ]]; then
    eval $(~/.local/bin/keychain --quiet --eval id_ed25519)
fi

# Add useful aliases
alias ll='ls -lah'
alias cd..='cd ..'

Essential Environment Variables

Set these in your shell configuration:

# Editor (for Git, system tools)
export EDITOR=vim
export GIT_EDITOR=vim

# Language and encoding
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

# File creation permissions
umask 0007

# Container support
export XDG_RUNTIME_DIR="/run/user/$(id -u)"

Color Schemes

Directory Colors for Better Visibility

Add to your shell configuration for improved readability:

# Export LS_COLORS with improved directory visibility
# Change directory color from dark blue (01;34) to cyan (01;36)
export LS_COLORS="di=01;36:ln=01;36:so=01;31:pi=40;33:ex=01;32:bd=40;33;01:cd=40;33;01:su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzop=01;31:*.xz=01;31:*.zst=01;31:*.zstd=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:"

Key color changes: - di=01;36 - Directories in cyan (easier to see than dark blue) - ln=01;36 - Symlinks in cyan - ex=01;32 - Executables in green

Vim Color Scheme

Configure Vim for better visibility in ~/.vimrc:

" Enable syntax highlighting
syntax on

" Use desert color scheme
colorscheme desert

Command History

Keep your shell history clean and effective:

# Increase history size
export HISTSIZE=10000
export HISTFILESIZE=10000

# Ignore duplicate commands
export HISTCONTROL=ignoredups

# Ignore common commands from history
export HISTIGNORE="ls:cd:pwd:history"

SSH Keychain Auto-Loading

Smart Keychain Initialization

Add SSH keychain evaluation to your shell profile, with Slurm PTY detection:

# SSH Keychain - Skip in Slurm computing environment
# This avoids conflicts with Slurm's PTY management
if [[ -z "$SLURM_PTY_PORT" ]]; then
    eval $(~/.local/bin/keychain --quiet --eval id_ed25519)
fi

Why the Slurm check? - Slurm (job scheduler) has its own PTY management - Loading keychain in Slurm context can cause conflicts - Check $SLURM_PTY_PORT to detect Slurm environment - Skip keychain loading in compute jobs

Complete Configuration Example

Full ~/.bashrc with All Settings

# File creation permissions
umask 0007

# PATH Configuration
export PATH="$HOME/.local/bin:$PATH"
export PATH="$PATH:$HOME/bin"
export PATH="$PATH:$HOME/.cargo/bin"

# Editor
export EDITOR=vim
export GIT_EDITOR=vim

# Language
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

# Container support
export XDG_RUNTIME_DIR="/run/user/$(id -u)"

# Conda/Micromamba
export CONDA_EXE="$(command -v micromamba)"

# Directory colors (cyan for better visibility)
export LS_COLORS="di=01;36:..."

# History
export HISTSIZE=10000
export HISTFILESIZE=10000
export HISTCONTROL=ignoredups
export HISTIGNORE="ls:cd:pwd:history"

# Container aliases
if command -v podman &> /dev/null; then
    alias docker='podman'
fi

# SSH Keychain (skip in Slurm)
if [[ -z "$SLURM_PTY_PORT" ]]; then
    eval $(~/.local/bin/keychain --quiet --eval id_ed25519)
fi

# Useful aliases
alias ..='cd ..'
alias ...='cd ../..'
alias ll='ls -lah'
alias l='ls -la'
alias cls='clear'
alias py='python'
alias serve='python -m http.server'
alias clear-cache='rm -rf ~/.cache'

Secure Development Environment

Your shell environment should be:

  • Secure: SSH keys with passphrases, keychain for convenience, restricted permissions (umask)
  • Clean: Well-organized PATH, proper binary resolution
  • Productive: Useful aliases, good history management, proper colors
  • Isolated: Virtual environments, container support, environment detection (Slurm)
  • Collaborative: Group-writable files (umask 0007) for team projects