# DGX Lab: Supercharge Your Shell with 50+ ML Productivity Aliases
<div class="callout" data-callout="info">
<parameter name="callout-title">Lab Session Info</div>
<div class="callout-content">
**Date**: October 18, 2025
**DGX System**: NVIDIA DGX Workstation
**Session Duration**: ~30 minutes
**Primary Focus**: Shell environment optimization for ML workflows
</div>
</div>
## Why Your Shell Environment Matters
You open a terminal dozens of times a day. You type `nvidia-smi` to check GPU status. You activate virtual environments. You navigate directories. You check git status. These small actions add up to hundreds of keystrokes daily.
What if you could cut that by 70%?
Today's session is about transforming the default Ubuntu `.bashrc` into a productivity powerhouse optimized for ML and GPU development. No fancy tools required—just smart configuration that takes 5 minutes to set up and benefits you forever.
## The Quick Win
Here's what changed in this 30-minute session:
- **50+ productivity aliases** added
- **10+ custom functions** for common tasks
- **GPU monitoring shortcuts** for instant status checks
- **Enhanced command history** (10K commands with timestamps)
- **Smart Python helpers** for virtual environment management
The result? Commands that took 10-15 keystrokes now take 2-3.
## The Essential Aliases
### GPU Monitoring (The Most Used)
```bash
# Basic GPU check
alias gpu='nvidia-smi'
# Real-time monitoring (updates every second)
alias gpuw='watch -n 1 nvidia-smi'
# Memory-focused view
alias gpumem='nvidia-smi --query-gpu=memory.used,memory.total --format=csv'
```
**Impact**: `gpu` instead of `nvidia-smi` saves 9 keystrokes. If you check GPU status 50 times a day, that's **450 keystrokes saved daily**.
### Python Environment Management
```bash
# Python shortcuts
alias py='python3'
alias pip='pip3'
alias venv='python3 -m venv'
alias activate='source venv/bin/activate'
```
**Real-world usage:**
```bash
# Before: 47 keystrokes
python3 -m venv myenv
source myenv/bin/activate
# After: 23 keystrokes
venv myenv
activate
```
**50% keystroke reduction** for virtual environment creation.
### Git Workflow Shortcuts
```bash
alias g='git'
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git push'
alias gl='git log --oneline --graph --decorate'
alias gd='git diff'
```
**Typical workflow:**
```bash
# Before: 67 keystrokes
git status
git add .
git commit -m "update model"
git push
# After: 33 keystrokes
gs
ga .
gc -m "update model"
gp
```
**50% reduction** in common git operations.
### Smart Navigation
```bash
# Quick parent directory navigation
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
# Enhanced directory listing
alias ll='ls -lh' # Human-readable sizes
alias la='ls -lhA' # Include hidden files
alias lt='ls -lhrt' # Sort by time, newest last
alias lz='ls -lhS' # Sort by size
alias ld='ls -lrta' # All files, by time (oldest first)
```
### Safety Nets
```bash
# Confirm before destructive operations
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Create parent directories automatically
alias mkdir='mkdir -pv'
```
These have saved me from countless accidental deletions.
## Custom Functions (The Power Tools)
### mkcd - Create and Enter Directory
```bash
mkcd() {
mkdir -p "$1" && cd "$1"
}
```
**Usage:**
```bash
# Before: two commands
mkdir -p ~/projects/new-experiment
cd ~/projects/new-experiment
# After: one command
mkcd ~/projects/new-experiment
```
### extract - Universal Archive Handler
```bash
extract() {
if [ -f $1 ]; then
case $1 in
*.tar.bz2) tar xjf $1 ;;
*.tar.gz) tar xzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) unrar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xf $1 ;;
*.tbz2) tar xjf $1 ;;
*.tgz) tar xzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*) echo "'$1' cannot be extracted via extract()" ;;
esac
else
echo "'$1' is not a valid file"
fi
}
```
**No more googling** "how to extract .tar.bz2 files"—just `extract file.tar.bz2`.
### pyvenv - Fast Python Environment Setup
```bash
pyvenv() {
if [ -z "$1" ]; then
echo "Usage: pyvenv <env_name>"
return 1
fi
python3 -m venv "$1"
source "$1/bin/activate"
pip install --upgrade pip
echo "Python virtual environment '$1' created and activated"
}
```
**Usage:**
```bash
pyvenv ml-project
# Creates venv, activates it, upgrades pip—all in one command
```
### gpucheck - Comprehensive GPU Status
```bash
gpucheck() {
echo "=== GPU Information ==="
nvidia-smi --query-gpu=gpu_name,driver_version,memory.total --format=csv,noheader
echo -e "\n=== CUDA Version ==="
nvcc --version 2>/dev/null | grep "release" || echo "nvcc not found"
echo -e "\n=== GPU Utilization ==="
nvidia-smi --query-gpu=index,name,utilization.gpu,memory.used,memory.total --format=csv
echo -e "\n=== Running GPU Processes ==="
nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv
}
```
**Output:**
```
=== GPU Information ===
NVIDIA A100-PCIE-40GB, 535.129.03, 40960 MiB
=== CUDA Version ===
Cuda compilation tools, release 12.1, V12.1.105
=== GPU Utilization ===
index, name, utilization.gpu [%], memory.used [MiB], memory.total [MiB]
0, NVIDIA A100-PCIE-40GB, 85 %, 32768 MiB, 40960 MiB
=== Running GPU Processes ===
pid, process_name, used_gpu_memory [MiB]
12345, python, 32256 MiB
```
One command gives you **everything you need** to know about GPU status.
### sysinfo - Complete System Overview
```bash
sysinfo() {
echo "=== System Information ==="
echo "OS: $(lsb_release -d | cut -f2)"
echo "Kernel: $(uname -r)"
echo "Uptime: $(uptime -p)"
echo -e "\n=== CPU ==="
lscpu | grep "Model name" | cut -d':' -f2 | xargs
echo "Cores: $(nproc)"
echo -e "\n=== Memory ==="
free -h | grep "Mem:" | awk '{print "Total: "$2" | Used: "$3" | Available: "$7}'
echo -e "\n=== Disk Usage ==="
df -h / | tail -1 | awk '{print "Root: "$3" used / "$2" total ("$5" full)"}'
echo -e "\n=== GPU ==="
nvidia-smi --query-gpu=name,memory.total --format=csv,noheader 2>/dev/null || echo "No GPU detected"
}
```
Perfect for **quick health checks** or sharing system specs with collaborators.
## History Enhancements
```bash
# Increase history size from 1,000 to 10,000 commands
export HISTSIZE=10000
export HISTFILESIZE=20000
# Add timestamps to history
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
# Avoid duplicates
export HISTCONTROL=ignoredups:erasedups
# Append to history file (don't overwrite)
shopt -s histappend
```
**Why this matters for ML:**
- Track which hyperparameters you tested and when
- Find that perfect training command from last week
- Debug "what did I run yesterday at 3pm?"
### History Search Tips
```bash
# Search history with timestamps
history | grep "python train.py"
# Re-run command by number
!1234
# Re-run last command starting with "git"
!git
# Edit and re-run last command
^wrong^right
```
## Environment Variables That Matter
### CUDA Configuration
```bash
export CUDA_HOME=/usr/local/cuda
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
```
Ensures `nvcc` is accessible and CUDA libraries are found by PyTorch/TensorFlow.
### Python Optimization
```bash
# Real-time output (critical for training logs)
export PYTHONUNBUFFERED=1
# Prevent .pyc file creation
export PYTHONDONTWRITEBYTECODE=1
```
**PYTHONUNBUFFERED=1** is **crucial** for ML training:
- See training progress in real-time
- Monitor loss curves as they happen
- Catch errors immediately
Without it, logs buffer and you might not see output for minutes.
### Enhanced Prompt with Git Branch
```bash
# Show git branch in prompt (yellow)
parse_git_branch() {
git branch 2>/dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[33m\]$(parse_git_branch)\[\033[00m\]\$ '
```
**Result:**
```bash
bioinfo@dgx:~/projects/ml-experiment (feature-branch)$
```
Always know which experiment branch you're on.
## The Complete Setup
Want this configuration? Here's the full enhanced `.bashrc`:
<div class="callout" data-callout="tip">
<div class="callout-title">Quick Setup</div>
<div class="callout-content">
1. **Backup your existing .bashrc:**
```bash
cp ~/.bashrc ~/.bashrc.backup
```
2. **Add the aliases and functions** (see full file below)
3. **Reload your shell:**
```bash
source ~/.bashrc
```
4. **Test it out:**
```bash
gpu # Check GPU status
gs # Git status
mkcd test # Create and enter directory
sysinfo # System overview
```
</div>
</div>
### Core Additions to .bashrc
```bash
# ============================================
# History Configuration
# ============================================
export HISTSIZE=10000
export HISTFILESIZE=20000
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
export HISTCONTROL=ignoredups:erasedups
shopt -s histappend
# ============================================
# Shell Options
# ============================================
shopt -s globstar # Enable ** for recursive matching
shopt -s nocaseglob # Case-insensitive filename completion
bind "set show-all-if-ambiguous on"
bind "set mark-symlinked-directories on"
# ============================================
# GPU Monitoring Aliases
# ============================================
alias gpu='nvidia-smi'
alias gpuw='watch -n 1 nvidia-smi'
alias gpumem='nvidia-smi --query-gpu=memory.used,memory.total --format=csv'
# ============================================
# Python Shortcuts
# ============================================
alias py='python3'
alias pip='pip3'
alias venv='python3 -m venv'
alias activate='source venv/bin/activate'
# ============================================
# Git Shortcuts
# ============================================
alias g='git'
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git push'
alias gl='git log --oneline --graph --decorate'
alias gd='git diff'
# ============================================
# Directory Navigation
# ============================================
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
# ============================================
# Enhanced Listing
# ============================================
alias ll='ls -lh'
alias la='ls -lhA'
alias lt='ls -lhrt'
alias lz='ls -lhS'
alias ld='ls -lrta'
# ============================================
# Safety Nets
# ============================================
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias mkdir='mkdir -pv'
# ============================================
# System Information
# ============================================
alias myip='curl -s ifconfig.me'
alias meminfo='free -h'
alias cpuinfo='lscpu'
alias diskusage='df -h'
alias topcpu='ps aux --sort=-%cpu | head -n 11'
alias topmem='ps aux --sort=-%mem | head -n 11'
# ============================================
# Environment Variables
# ============================================
export CUDA_HOME=/usr/local/cuda
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
export EDITOR=nano
export VISUAL=nano
export PYTHONUNBUFFERED=1
export PYTHONDONTWRITEBYTECODE=1
export LESS='-R -X -F'
# ============================================
# Custom Functions
# ============================================
# Create directory and cd into it
mkcd() {
mkdir -p "$1" && cd "$1"
}
# Universal archive extraction
extract() {
if [ -f $1 ]; then
case $1 in
*.tar.bz2) tar xjf $1 ;;
*.tar.gz) tar xzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) unrar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xf $1 ;;
*.tbz2) tar xjf $1 ;;
*.tgz) tar xzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*) echo "'$1' cannot be extracted" ;;
esac
else
echo "'$1' is not a valid file"
fi
}
# Find files by name
ff() {
find . -type f -iname "*$1*"
}
# Find directories by name
fd() {
find . -type d -iname "*$1*"
}
# Recursive grep with line numbers
grepn() {
grep -rn "$1" .
}
# Display PATH in readable format
showpath() {
echo $PATH | tr ':' '\n' | nl
}
# Quick Python venv setup
pyvenv() {
if [ -z "$1" ]; then
echo "Usage: pyvenv <env_name>"
return 1
fi
python3 -m venv "$1"
source "$1/bin/activate"
pip install --upgrade pip
echo "Python virtual environment '$1' created and activated"
}
# Comprehensive GPU check
gpucheck() {
echo "=== GPU Information ==="
nvidia-smi --query-gpu=gpu_name,driver_version,memory.total --format=csv,noheader
echo -e "\n=== CUDA Version ==="
nvcc --version 2>/dev/null | grep "release" || echo "nvcc not found"
echo -e "\n=== GPU Utilization ==="
nvidia-smi --query-gpu=index,name,utilization.gpu,memory.used,memory.total --format=csv
echo -e "\n=== Running GPU Processes ==="
nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv
}
# Python environment info
pyinfo() {
echo "=== Python Environment ==="
echo "Python: $(python3 --version)"
echo "Location: $(which python3)"
echo "Pip: $(pip3 --version | cut -d' ' -f1-2)"
[ -n "$VIRTUAL_ENV" ] && echo "Active venv: $VIRTUAL_ENV" || echo "No active venv"
echo -e "\nInstalled packages:"
pip3 list | head -n 10
}
# Complete system overview
sysinfo() {
echo "=== System Information ==="
echo "OS: $(lsb_release -d | cut -f2)"
echo "Kernel: $(uname -r)"
echo "Uptime: $(uptime -p)"
echo -e "\n=== CPU ==="
lscpu | grep "Model name" | cut -d':' -f2 | xargs
echo "Cores: $(nproc)"
echo -e "\n=== Memory ==="
free -h | grep "Mem:" | awk '{print "Total: "$2" | Used: "$3" | Available: "$7}'
echo -e "\n=== Disk Usage ==="
df -h / | tail -1 | awk '{print "Root: "$3" used / "$2" total ("$5" full)"}'
echo -e "\n=== GPU ==="
nvidia-smi --query-gpu=name,memory.total --format=csv,noheader 2>/dev/null || echo "No GPU detected"
}
# ============================================
# Enhanced Prompt with Git Branch
# ============================================
parse_git_branch() {
git branch 2>/dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[33m\]$(parse_git_branch)\[\033[00m\]\$ '
# ============================================
# Colored GCC Output
# ============================================
export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
# ============================================
# Welcome Message
# ============================================
if [ -f /usr/bin/nvidia-smi ]; then
echo "🖥️ DGX Workstation - $(nvidia-smi --query-gpu=gpu_name --format=csv,noheader | head -1)"
echo "🐍 Python $(python3 --version | cut -d' ' -f2)"
echo "⚡ CUDA $(nvcc --version 2>/dev/null | grep release | cut -d' ' -f5 | sed 's/,//' || echo 'N/A')"
echo ""
echo "Quick commands: gpu | gpuw | gpucheck | sysinfo | pyinfo"
fi
```
## Real-World Impact
After implementing this configuration:
**Keystroke Savings:**
- GPU checks: 450 keystrokes/day
- Git operations: 200 keystrokes/day
- Python venv: 150 keystrokes/day
- Directory navigation: 100 keystrokes/day
**Total: ~900 keystrokes saved daily** = **23,400 keystrokes/month**
**Time Savings:**
- ~5-10 minutes per day from faster command entry
- ~10 minutes per day from quick status checks
- ~5 minutes per day from not googling extraction commands
**Total: ~20 minutes/day = 7 hours/month**
## What I Learned
### 1. Small Optimizations Compound
Each alias saves 5-10 keystrokes. Over hundreds of daily uses, this adds up to significant time savings.
### 2. Muscle Memory Matters
Keep aliases short and memorable:
- `gpu` (not `checkgpu` or `gpustatus`)
- `gs` (not `gits` or `gstat`)
- `..` (not `up` or `back`)
Your fingers will thank you.
### 3. Safety First
The `-i` flag on `rm`, `cp`, and `mv` has saved me countless times. Confirmation prompts are worth the extra keystroke.
### 4. Documentation Through Code
Good alias names are self-documenting:
- `gpumem` → obviously checks GPU memory
- `topcpu` → obviously shows top CPU processes
- `extract` → obviously extracts archives
## Next Steps
Try adding these to your `.bashrc` and see which ones you use most. After a week, you'll wonder how you ever lived without them.
**Pro tip**: Start with just the GPU monitoring aliases if you're on a GPU system, or just the Python helpers if you do a lot of ML work. Add more as you need them.
---
## Related Articles
[[Practical Applications/dgx-lab-intelligent-gateway-heuristics-vs-ml-day-1|DGX Lab Day 1: Intelligent Gateway with Heuristics]]
[[Practical Applications/building-production-ml-workspace-part-1-structure|Building Production ML Workspaces: Part 1]]
[[Practical Applications/⌂ Practical Applications|Practical Applications Hub]]
<div class="callout" data-callout="tip">
<div class="callout-title">Try It Yourself</div>
<div class="callout-content">
**5-Minute Setup:**
1. `cp ~/.bashrc ~/.bashrc.backup` - Backup current config
2. Add the aliases from this article to your `.bashrc`
3. `source ~/.bashrc` - Reload shell
4. Try `gpu`, `gs`, `mkcd test`, `sysinfo`
**Bonus**: Track which aliases you use most with `history | cut -d' ' -f2 | sort | uniq -c | sort -rn | head -20`
</div>
</div>
---
*This is Day 2 of the DGX Lab Chronicles, documenting real AI infrastructure setup on NVIDIA DGX hardware.*