Table of Contents
Architecture Overview
Gosh is organized into multiple modules for maximum readability and maintainability:
main.go
- Entry point and argument handlingshell.go
- Core shell structure and main loopparser.go
- Command line parsing and tokenizationexecutor.go
- Command execution logicexpansion.go
- Variable and command expansionbuiltins.go
- Built-in command implementationsutils.go
- Utility functions
Advanced Variable Expansion
Variable Declaration Requirements
All variables in gosh must be explicitly declared with either local
or export
:
# Local variables (current shell only)
local TEMP_VAR="temporary"
local COUNT=42
# Environment variables (exported to child processes)
export PATH="$PATH:/new/path"
export CONFIG_FILE="app.conf"
Complex Variable Substitution
# Nested variable expansion
export BASE_DIR="/home/user" # Environment variable
export PROJECT_DIR="${BASE_DIR}/projects" # Environment variable
local CURRENT_PROJECT="${PROJECT_DIR}/gosh" # Local variable
echo "Working in: $CURRENT_PROJECT"
Variable Expansion in Command Substitution
export SEARCH_TERM="error" # Environment variable
export LOG_FILE="/var/log/system.log" # Environment variable
# Use variables within command substitution
local OCCURRENCE_COUNT="$(grep "$SEARCH_TERM" "$LOG_FILE" | wc -l)" # Local variable
echo "Found $OCCURRENCE_COUNT occurrences"
Line Continuation
Gosh supports line continuation using backslashes (\
) at the end of lines, allowing you to split long commands across multiple lines for better readability.
Basic Line Continuation
# Split a long echo command
echo "This is a very long message" \
"that spans multiple lines" \
"for better readability"
# Long command with many arguments
ls -la \
*.go \
*.md \
*.txt
Line Continuation in Pipelines
# Multi-stage pipeline
cat large_file.txt | \
grep "pattern" | \
sort | \
uniq -c | \
head -20
Line Continuation in Command Chains
# Sequential commands
echo "Step 1: Preparing..."; \
mkdir -p output; \
echo "Step 2: Processing..."; \
touch output/result.txt; \
echo "Step 3: Complete!"
Windows Path Separator Compatibility
Gosh intelligently distinguishes between line continuation backslashes and Windows path separators:
# These work correctly on Windows (no line continuation)
cd C:\Users\username\Documents
cd ~\Projects\
ls *.txt | grep pattern > results.txt
# These are actual line continuations
echo "This is a long command" \
"that continues on the next line"
ls -la \
*.go \
*.md
Interactive vs Script Usage
Line continuation works in both interactive mode and script files:
- Interactive: Use backslash at end of line, press Enter, and continue on the next line with a
>
prompt - Scripts: Use backslash at end of line and continue the command on subsequent lines
Best Practices
- Use line continuation to improve readability of complex commands
- Indent continued lines for visual clarity
- Avoid unnecessary spaces after the backslash
- Be consistent with your continuation style within scripts
- On Windows, use forward slashes for intentional line continuation to avoid confusion with path separators
Advanced Glob Patterns
Character Classes
# Match files starting with uppercase letters
ls [A-Z]*
# Match files with specific extensions
ls *.[ch] # .c or .h files
# Exclude patterns (when supported by underlying system)
ls !(*.tmp) # All files except .tmp files
Complex Glob Combinations
# Multiple patterns
ls *.{go,md,txt}
# Nested directory patterns
find . -name "*.go" -type f
Advanced Piping Techniques
Multi-stage Data Processing
# Complex data pipeline with line continuation
cat data.csv | \
grep -v "^#" | \
cut -d',' -f2,3 | \
sort | \
uniq -c | \
sort -nr | \
head -10
Combining Pipes with Redirection
# Process data and save both intermediate and final results
cat input.txt | \
tee intermediate.txt | \
sort | \
tee sorted.txt | \
uniq > final.txt
Environment Management
Advanced Environment Variable Techniques
# Save and restore environment
local OLD_PATH="$PATH" # Local variable to store original PATH
export PATH="/custom/bin:$PATH" # Environment variable
# ... do work with custom PATH ...
export PATH="$OLD_PATH" # Restore original PATH
unset OLD_PATH
Dynamic Environment Setup
# Set environment based on conditions
export ENVIRONMENT="development" # Environment variable
export CONFIG_FILE="config_${ENVIRONMENT}.json" # Environment variable
export LOG_LEVEL="debug" # Environment variable
echo "Using config: $CONFIG_FILE"
echo "Log level: $LOG_LEVEL"
Advanced Aliasing
Complex Aliases
# Aliases with multiple commands
alias backup="tar -czf backup_$(date +%Y%m%d).tar.gz"
alias logcheck="tail -f /var/log/system.log | grep ERROR"
# Aliases with pipes
alias psgrep="ps aux | grep"
alias netstat="netstat -tuln | grep LISTEN"
Temporary Aliases
# Create temporary aliases for a session
alias temp_alias="echo 'This is temporary'"
temp_alias
unalias temp_alias
Advanced Scripting Patterns
Error Handling Patterns
#!/usr/bin/env gosh
# Function-like command grouping
echo "Starting backup process..."
# Check if source directory exists
if [ -d "$SOURCE_DIR" ]; then
echo "Source directory found: $SOURCE_DIR"
else
echo "Error: Source directory not found: $SOURCE_DIR"
exit 1
fi
# Perform backup with status checking
tar -czf "backup.tar.gz" "$SOURCE_DIR"
echo "Backup completed with status: $?"
Configuration Management
#!/usr/bin/env gosh
# Configuration-driven script
# Load configuration
export CONFIG_FILE="${HOME}/.gosh_config"
if [ -f "$CONFIG_FILE" ]; then
echo "Loading configuration from $CONFIG_FILE"
else
echo "Using default configuration"
export DEFAULT_EDITOR="nano"
export DEFAULT_PAGER="less"
fi
Performance Optimization
Efficient Command Patterns
# Avoid unnecessary command substitution
# Instead of: echo "Files: $(ls | wc -l)"
# Use when possible: ls | wc -l
# Minimize pipe stages
# Instead of: cat file | grep pattern | wc -l
# Use: grep pattern file | wc -l
Memory-Efficient Processing
# Process large files efficiently
# Stream processing instead of loading entire files
tail -f large_log.txt | grep "ERROR" | head -100
# Use appropriate tools for the job
grep "pattern" large_file.txt > matches.txt # Better than cat | grep
System Integration
# System monitoring scripts
echo "System Status Report - $(date)"
echo "=================================="
echo "Disk Usage:"
df -h | head -5
echo ""
echo "Memory Usage:"
free -h 2>/dev/null || vm_stat
echo ""
echo "Load Average:"
uptime
Debugging and Troubleshooting
Debug Mode Techniques
#!/usr/bin/env gosh
# Enable debug output
export DEBUG=1
if [ "$DEBUG" = "1" ]; then
echo "Debug: Starting script execution"
fi
# Trace command execution
echo "Executing: ls -la"
ls -la
if [ "$DEBUG" = "1" ]; then
echo "Debug: Command completed"
fi
Error Logging
# Log errors to file
export ERROR_LOG="/tmp/gosh_errors.log"
# Redirect errors
command_that_might_fail 2>> "$ERROR_LOG"
# Check for errors
if [ -s "$ERROR_LOG" ]; then
echo "Errors occurred, check $ERROR_LOG"
fi
Best Practices for Advanced Usage
- Modular Scripts: Break complex scripts into smaller, reusable components
- Error Handling: Always consider what happens when commands fail
- Resource Management: Be mindful of memory and CPU usage in scripts
- Security: Never expose sensitive data in command lines or environment variables
- Portability: Write scripts that work across different systems when possible
- Documentation: Comment complex logic and provide usage examples
- Testing: Test scripts with various inputs and edge cases
Platform-Specific Considerations
macOS Compatibility
Gosh is designed and tested for macOS, taking advantage of:
- BSD-style command utilities
- macOS-specific paths and conventions
- Native macOS terminal features
Cross-Platform Scripting
# Detect operating system
if command -v uname >/dev/null 2>&1; then
export OS_TYPE=$(uname -s)
else
export OS_TYPE="Windows"
fi
case "$OS_TYPE" in
"Darwin")
echo "Running on macOS"
export OPEN_CMD="open"
;;
"Linux")
echo "Running on Linux"
export OPEN_CMD="xdg-open"
;;
*)
echo "Unknown operating system: $OS_TYPE"
;;
esac
Future Enhancements
Areas for potential future development:
- Enhanced tab completion
- Job control improvements
- Additional built-in commands
- Configuration file support
- Plugin system
- Enhanced error reporting
Gosh continues to evolve while maintaining its core philosophy of simplicity and reliability!