| # Check and Analyze PATH | |
| You are helping the user analyze what's on their PATH and suggest additions or improvements. | |
| ## Your tasks: | |
| 1. **Display current PATH:** | |
| ```bash | |
| echo $PATH | tr ':' '\n' | |
| ``` | |
| 2. **Check which paths actually exist:** | |
| ```bash | |
| echo $PATH | tr ':' '\n' | while read p; do | |
| if [ -d "$p" ]; then | |
| echo "✓ $p" | |
| else | |
| echo "✗ $p (does not exist)" | |
| fi | |
| done | |
| ``` | |
| 3. **Check for duplicate PATH entries:** | |
| ```bash | |
| echo $PATH | tr ':' '\n' | sort | uniq -d | |
| ``` | |
| 4. **Identify where PATH is being set:** | |
| Check common locations: | |
| ```bash | |
| grep -n "PATH" ~/.bashrc ~/.bash_profile ~/.profile /etc/environment /etc/profile 2>/dev/null | |
| ``` | |
| 5. **Check for common development tool paths:** | |
| **Programming languages:** | |
| - Python user packages: `~/.local/bin` | |
| - Rust cargo: `~/.cargo/bin` | |
| - Go: `~/go/bin` or `$GOPATH/bin` | |
| - Ruby gems: Check with `gem environment` | |
| - Node/npm: Check with `npm config get prefix` | |
| **Package managers:** | |
| - Homebrew: `/home/linuxbrew/.linuxbrew/bin` | |
| - SDKMAN: `~/.sdkman/candidates/*/current/bin` | |
| - pipx: `~/.local/bin` | |
| **Version managers:** | |
| - pyenv: `~/.pyenv/bin` | |
| - rbenv: `~/.rbenv/bin` | |
| - nvm: (check ~/.nvm/) | |
| - asdf: `~/.asdf/bin` | |
| **System tools:** | |
| - User binaries: `~/bin`, `~/.local/bin` | |
| - Snap: `/snap/bin` | |
| - Flatpak: `/var/lib/flatpak/exports/bin` | |
| 6. **Check what's installed in each PATH directory:** | |
| For each directory in PATH: | |
| ```bash | |
| echo "Contents of $dir:" | |
| ls -la "$dir" | head -10 | |
| ``` | |
| 7. **Suggest missing common paths:** | |
| Check and suggest if not in PATH: | |
| - `~/.local/bin` (Python user packages, pipx) | |
| - `~/bin` (User scripts) | |
| - `~/.cargo/bin` (Rust packages) | |
| - `~/go/bin` (Go packages) | |
| - `/snap/bin` (Snap packages) | |
| - `~/.npm-global/bin` (npm global packages) | |
| For each missing path that has executables, suggest adding it. | |
| 8. **Check for security issues:** | |
| - Warn if `.` (current directory) is in PATH | |
| - Warn if world-writable directories are in PATH: | |
| ```bash | |
| echo $PATH | tr ':' '\n' | while read p; do | |
| if [ -d "$p" ] && [ -w "$p" ]; then | |
| ls -ld "$p" | |
| fi | |
| done | |
| ``` | |
| 9. **Check PATH order/precedence:** | |
| Explain that earlier paths take precedence. | |
| Show which binary would be executed: | |
| ```bash | |
| which -a python python3 java gcc git node npm | |
| ``` | |
| 10. **Check for conflicting tools:** | |
| ```bash | |
| type -a python | |
| type -a python3 | |
| type -a java | |
| ``` | |
| 11. **Suggest PATH organization:** | |
| Recommended order: | |
| 1. User binaries (`~/bin`, `~/.local/bin`) | |
| 2. Version managers (pyenv, rbenv, nvm) | |
| 3. Language-specific paths (cargo, go) | |
| 4. Homebrew | |
| 5. System binaries (`/usr/local/bin`, `/usr/bin`, `/bin`) | |
| 12. **Check environment-specific paths:** | |
| **Python:** | |
| ```bash | |
| python3 -m site --user-base | |
| # Suggests adding $(python3 -m site --user-base)/bin | |
| ``` | |
| **Node/npm:** | |
| ```bash | |
| npm config get prefix | |
| # Suggests adding <prefix>/bin | |
| ``` | |
| **Go:** | |
| ```bash | |
| go env GOPATH | |
| # Suggests adding $GOPATH/bin | |
| ``` | |
| **Rust:** | |
| ```bash | |
| echo $CARGO_HOME | |
| # Suggests adding ~/.cargo/bin | |
| ``` | |
| 13. **Generate suggested PATH setup:** | |
| Based on findings, create suggested additions for ~/.bashrc: | |
| ```bash | |
| # User binaries | |
| export PATH="$HOME/bin:$PATH" | |
| export PATH="$HOME/.local/bin:$PATH" | |
| # Python | |
| export PATH="$HOME/.local/bin:$PATH" | |
| # Rust | |
| export PATH="$HOME/.cargo/bin:$PATH" | |
| # Go | |
| export PATH="$HOME/go/bin:$PATH" | |
| # SDKMAN | |
| # Added by sdkman-init.sh | |
| # pyenv | |
| export PYENV_ROOT="$HOME/.pyenv" | |
| export PATH="$PYENV_ROOT/bin:$PATH" | |
| eval "$(pyenv init --path)" | |
| # Homebrew | |
| eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" | |
| ``` | |
| 14. **Check for broken symlinks in PATH:** | |
| ```bash | |
| echo $PATH | tr ':' '\n' | while read dir; do | |
| if [ -d "$dir" ]; then | |
| find "$dir" -maxdepth 1 -type l ! -exec test -e {} \; -print 2>/dev/null | |
| fi | |
| done | |
| ``` | |
| 15. **Provide recommendations:** | |
| - Remove non-existent directories from PATH | |
| - Add missing common paths that have executables | |
| - Fix duplicate entries | |
| - Correct PATH order if needed | |
| - Remove security issues (`.` in PATH, world-writable dirs) | |
| - Consolidate PATH modifications into one file (prefer ~/.bashrc) | |
| - Document what each PATH addition is for | |
| 16. **Show how to temporarily modify PATH:** | |
| ```bash | |
| # Add to front (takes precedence) | |
| export PATH="/new/path:$PATH" | |
| # Add to end | |
| export PATH="$PATH:/new/path" | |
| # Remove from PATH | |
| export PATH=$(echo $PATH | tr ':' '\n' | grep -v "/path/to/remove" | tr '\n' ':') | |
| ``` | |
| 17. **Show how to make PATH changes permanent:** | |
| ```bash | |
| echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc | |
| source ~/.bashrc | |
| ``` | |
| ## Important notes: | |
| - Changes to PATH only affect current shell unless made permanent | |
| - Order matters - earlier paths have precedence | |
| - Don't add current directory (`.`) to PATH | |
| - Use absolute paths when possible | |
| - Source ~/.bashrc after changes: `source ~/.bashrc` | |
| - Some tools (pyenv, conda, nvm) modify PATH dynamically | |
| - Check for PATH modifications in multiple files | |