
Do you know – How To Set Environment Variables in Linux? Here is the Complete Guide to System Configuration in Linux. Environment variables are the hidden backbone of Linux systems, serving as dynamic named values that influence the behavior of processes and applications running on the system. From configuring your development environment to controlling system-wide behavior, understanding how to properly set and manage environment variables is crucial for any Linux user or administrator.
Understanding Environment Variables: The System’s Control Panel
Think of environment variables as global settings or configuration parameters that programs can access to determine how they should behave. They’re like the control knobs and switches for your applications and system utilities.
![Environment Variable Hierarchy – Showing system-wide and user-specific variables]
Why Environment Variables Matter
- Configuration Management: Store database URLs, API keys, and application settings
- Path Resolution: Control where the system looks for executable files
- Development Environments: Switch between different project configurations
- System Behavior: Modify how shell and system utilities operate
- Security: Store sensitive information outside of code
Viewing Existing Environment Variables
Before setting new variables, it’s essential to understand how to view existing ones.
The printenv Command
bash
thecloudstrap@ubuntu:~$ printenv USER=thecloudstrap HOME=/home/thecloudstrap SHELL=/bin/bash TERM=xterm-256color PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin LANG=en_US.UTF-8 PWD=/home/thecloudstrap
Viewing Specific Variables
bash
thecloudstrap@ubuntu:~$ printenv HOME /home/thecloudstrap thecloudstrap@ubuntu:~$ printenv PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Using echo with Dollar Sign
bash
thecloudstrap@ubuntu:~$ echo $HOME /home/thecloudstrap thecloudstrap@ubuntu:~$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Listing All Variables with env
bash
thecloudstrap@ubuntu:~$ env USER=thecloudstrap LOGNAME=thecloudstrap HOME=/home/thecloudstrap PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin SHELL=/bin/bash TERM=xterm-256color
Setting Temporary Environment Variables
Temporary variables exist only for the current session and are lost when the session ends.
Basic Variable Assignment
bash
thecloudstrap@ubuntu:~$ MY_VAR="Hello World" thecloudstrap@ubuntu:~$ echo $MY_VAR Hello World
Variables with Spaces and Special Characters
bash
thecloudstrap@ubuntu:~$ GREETING="Hello, Linux World!" thecloudstrap@ubuntu:~$ echo $GREETING Hello, Linux World! thecloudstrap@ubuntu:~$ FILE_PATH="/home/thecloudstrap/Documents/My File.txt" thecloudstrap@ubuntu:~$ echo $FILE_PATH /home/thecloudstrap/Documents/My File.txt
Using Variables in Commands
bash
thecloudstrap@ubuntu:~$ BACKUP_DIR="/backup/$(date +%Y%m%d)" thecloudstrap@ubuntu:~$ echo $BACKUP_DIR /backup/20240515 thecloudstrap@ubuntu:~$ mkdir -p $BACKUP_DIR thecloudstrap@ubuntu:~$ ls -la /backup/ drwxr-xr-x 2 thecloudstrap thecloudstrap 4096 May 15 14:30 20240515
Exporting Variables to Subprocesses
bash
thecloudstrap@ubuntu:~$ DATABASE_URL="postgresql://localhost:5432/mydb" thecloudstrap@ubuntu:~$ export DATABASE_URL # Or combine assignment and export thecloudstrap@ubuntu:~$ export API_KEY="abc123def456"
Setting Permanent Environment Variables
For variables that should persist across sessions, we need to add them to configuration files.
User-Specific Permanent Variables
1. Bash Profile (~/.bashrc)
Ideal for user-specific variables and aliases:
bash
thecloudstrap@ubuntu:~$ nano ~/.bashrc # Add these lines at the end of the file export EDITOR=nano export PROJECT_HOME="/home/thecloudstrap/projects" export PYTHONPATH="$PROJECT_HOME/python_libs" # Custom prompt with git branch export PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' # Apply changes immediately thecloudstrap@ubuntu:~$ source ~/.bashrc
2. Bash Profile (~/.bash_profile)
For login sessions:
bash
thecloudstrap@ubuntu:~$ nano ~/.bash_profile # Add environment variables export JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64" export PATH="$JAVA_HOME/bin:$PATH" export NODE_ENV="development"
3. Profile File (~/.profile)
Shell-agnostic configuration:
bash
thecloudstrap@ubuntu:~$ nano ~/.profile # Environment variables for all shells export HISTSIZE=5000 export HISTFILESIZE=10000 export HISTCONTROL=ignoredups:erasedups
System-Wide Permanent Variables
1. Global Shell Configuration (/etc/environment)
Simple key-value pairs for all users:
bash
thecloudstrap@ubuntu:~$ sudo nano /etc/environment # Add system-wide variables DB_HOST="localhost" DB_PORT="5432" COMPANY_NAME="CloudStrap Inc" APP_ENVIRONMENT="production"
2. Global Bash Configuration (/etc/bash.bashrc)
System-wide bash-specific settings:
bash
thecloudstrap@ubuntu:~$ sudo nano /etc/bash.bashrc # System-wide environment variables export SYSTEM_LOGS="/var/log/applications" export BACKUP_DIR="/mnt/backups" export TMP_DIR="/tmp/global"
3. Profile Directory (/etc/profile.d/)
Modular approach for organizing variables:
bash
# Create custom configuration file thecloudstrap@ubuntu:~$ sudo nano /etc/profile.d/custom_vars.sh # Add environment variables export APP_VERSION="2.1.0" export SUPPORT_EMAIL="support@cloudstrap.com" export MAX_UPLOAD_SIZE="100M" # Make it executable thecloudstrap@ubuntu:~$ sudo chmod +x /etc/profile.d/custom_vars.sh
Practical Real-World Examples
Example 1: Development Environment Setup
bash
thecloudstrap@ubuntu:~$ nano ~/.bashrc # Development environment variables export DEV_MODE="true" export DEBUG_LEVEL="verbose" # Python development export PYTHONPATH="/home/thecloudstrap/dev/python/libs:$PYTHONPATH" export VIRTUALENVWRAPPER_PYTHON="/usr/bin/python3" export WORKON_HOME="/home/thecloudstrap/.virtualenvs" # Node.js development export NODE_ENV="development" export NODE_PATH="/home/thecloudstrap/dev/node_modules" # Database connections export DEV_DB_URL="postgresql://dev_user:password@localhost:5432/dev_db" export TEST_DB_URL="postgresql://test_user:password@localhost:5432/test_db" # Apply changes thecloudstrap@ubuntu:~$ source ~/.bashrc
Example 2: Application Configuration
bash
thecloudstrap@ubuntu:~$ sudo nano /etc/environment # Web application configuration export APP_SECRET_KEY="your-secret-key-here" export DATABASE_URL="postgresql://appuser:password@db-server:5432/production" export REDIS_URL="redis://redis-server:6379" export S3_BUCKET="my-app-production" export LOG_LEVEL="INFO" # Email configuration export SMTP_SERVER="smtp.gmail.com" export SMTP_PORT="587" export EMAIL_USER="noreply@myapp.com" # Third-party API keys export STRIPE_API_KEY="sk_live_xxxxxxxxxxxxxxxx" export SENDGRID_API_KEY="SG.xxxxxxxxxxxxxxxx"
Example 3: System Performance Tuning
bash
thecloudstrap@ubuntu:~$ sudo nano /etc/profile.d/performance.sh # Java performance tuning export JAVA_OPTS="-Xmx2g -Xms1g -XX:+UseG1GC" export CATALINA_OPTS="-Djava.awt.headless=true" # Python optimization export PYTHONHASHSEED="random" export PYTHONOPTIMIZE="1" # System limits export ULIMIT_N="65536" # Application-specific tuning export NODE_OPTIONS="--max-old-space-size=4096" export RUBY_GC_HEAP_GROWTH_MAX_SLOTS="40000"
The PATH Variable: A Special Case
The PATH variable is crucial as it determines where the system looks for executable files.
Viewing Current PATH
bash
thecloudstrap@ubuntu:~$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Adding Directories to PATH
bash
# Temporarily add to PATH thecloudstrap@ubuntu:~$ export PATH="$PATH:/home/thecloudstrap/bin" # Permanently add to PATH in ~/.bashrc thecloudstrap@ubuntu:~$ echo 'export PATH="$PATH:/home/thecloudstrap/bin"' >> ~/.bashrc thecloudstrap@ubuntu:~$ source ~/.bashrc # Add multiple directories thecloudstrap@ubuntu:~$ export PATH="/home/thecloudstrap/apps/bin:/opt/custom/tools:$PATH"
PATH Management Best Practices
bash
thecloudstrap@ubuntu:~$ nano ~/.bashrc
# Organized PATH management
CUSTOM_BIN_DIRS=(
"/home/thecloudstrap/bin"
"/home/thecloudstrap/.local/bin"
"/opt/myapp/bin"
)
for dir in "${CUSTOM_BIN_DIRS[@]}"; do
if [ -d "$dir" ]; then
export PATH="$dir:$PATH"
fi
done
Advanced Environment Variable Techniques
Conditional Variable Setting
bash
thecloudstrap@ubuntu:~$ nano ~/.bashrc
# Set variables based on conditions
if [ -f "/.dockerenv" ]; then
export CONTAINER_ENV="docker"
export LOG_LEVEL="DEBUG"
else
export CONTAINER_ENV="bare-metal"
export LOG_LEVEL="INFO"
fi
# Different settings for different hosts
HOSTNAME=$(hostname)
case $HOSTNAME in
"web-server-*")
export ROLE="web"
export PORT="80"
;;
"db-server-*")
export ROLE="database"
export PORT="5432"
;;
*)
export ROLE="unknown"
;;
esac
Variable Substitution and Default Values
bash
thecloudstrap@ubuntu:~$ nano ~/.bashrc
# Use default values if variable not set
export DB_HOST="${DB_HOST:-localhost}"
export DB_PORT="${DB_PORT:-5432}"
export MAX_CONNECTIONS="${MAX_CONNECTIONS:-100}"
# Conditional path addition
if [ -d "/opt/custom/bin" ]; then
export PATH="/opt/custom/bin:$PATH"
fi
Environment Variables in Scripts
bash
thecloudstrap@ubuntu:~$ cat > deploy.sh << 'EOF'
#!/bin/bash
# Use environment variables with defaults
ENVIRONMENT="${1:-development}"
CONFIG_FILE="${CONFIG_FILE:-/etc/app/config.ini}"
echo "Deploying to $ENVIRONMENT environment"
echo "Using configuration: $CONFIG_FILE"
# Database configuration from environment
DB_HOST="${DB_HOST:-localhost}"
DB_NAME="${DB_NAME:-app_$ENVIRONMENT}"
echo "Database: $DB_HOST/$DB_NAME"
EOF
thecloudstrap@ubuntu:~$ chmod +x deploy.sh
thecloudstrap@ubuntu:~$ DB_HOST="db.example.com" ./deploy.sh production
Security Best Practices
Handling Sensitive Information
bash
# Store sensitive data in separate, protected files thecloudstrap@ubuntu:~$ nano ~/.app_secrets # Add sensitive variables (restrict permissions!) export DB_PASSWORD="super-secret-password" export API_SECRET="very-secret-key" export ENCRYPTION_KEY="encryption-key-here" # Protect the file thecloudstrap@ubuntu:~$ chmod 600 ~/.app_secrets # Source it in your bashrc thecloudstrap@ubuntu:~$ echo '[ -f ~/.app_secrets ] && source ~/.app_secrets' >> ~/.bashrc
Environment-Specific Configuration
bash
thecloudstrap@ubuntu:~$ nano ~/.bashrc
# Load environment-specific configuration
CURRENT_ENV="${APP_ENV:-development}"
case $CURRENT_ENV in
"production")
source ~/.env_production
;;
"staging")
source ~/.env_staging
;;
"development")
source ~/.env_development
;;
*)
echo "Unknown environment: $CURRENT_ENV"
;;
esac
Troubleshooting Common Issues
Variable Not Available in Subshells
bash
# Problem: Variable set but not available in scripts thecloudstrap@ubuntu:~$ MY_VAR="value" thecloudstrap@ubuntu:~$ bash -c 'echo $MY_VAR' # Output: (empty) # Solution: Use export thecloudstrap@ubuntu:~$ export MY_VAR="value" thecloudstrap@ubuntu:~$ bash -c 'echo $MY_VAR' value
PATH Issues
bash
# Check if command exists in PATH
thecloudstrap@ubuntu:~$ which python3
/usr/bin/python3
# Find all occurrences in PATH
thecloudstrap@ubuntu:~$ find ${PATH//:/ } -name "python3" 2>/dev/null
/usr/bin/python3
/home/thecloudstrap/.local/bin/python3
# Debug PATH issues
thecloudstrap@ubuntu:~$ echo $PATH | tr ':' '\n'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
Variable Overwriting
bash
# Check current value thecloudstrap@ubuntu:~$ echo $MY_VAR original_value # Check where it's set thecloudstrap@ubuntu:~$ grep -r "MY_VAR" ~/.bashrc ~/.profile ~/.bash_profile /etc/environment /etc/profile.d/
Best Practices for Environment Variable Management
1. Use Descriptive Names
bash
# Good export DATABASE_CONNECTION_STRING="postgresql://user:pass@host:5432/db" export MAX_FILE_UPLOAD_SIZE="100MB" # Avoid export STR="value" export NUM=123
2. Organize by Purpose
bash
thecloudstrap@ubuntu:~$ nano ~/.bashrc # Database related export DB_HOST="localhost" export DB_PORT="5432" export DB_NAME="myapp" # Application settings export APP_DEBUG="false" export APP_LOG_LEVEL="INFO" export APP_TIMEZONE="UTC" # External services export AWS_REGION="us-east-1" export S3_BUCKET="my-backups"
3. Document Your Variables
bash
thecloudstrap@ubuntu:~$ nano ~/.bashrc # Environment Variables Documentation # =================================== # DB_HOST: Database server hostname # DB_PORT: Database server port # APP_DEBUG: Enable debug mode (true/false) # LOG_LEVEL: Application log level (DEBUG/INFO/WARN/ERROR) export DB_HOST="localhost" export DB_PORT="5432" export APP_DEBUG="false" export LOG_LEVEL="INFO"
4. Use Configuration Files for Complex Setups
bash
thecloudstrap@ubuntu:~$ cat > load_env_config.sh << 'EOF'
#!/bin/bash
# Load environment configuration
ENV_FILES=(
"/etc/environment"
"$HOME/.app_env"
"$HOME/.database_env"
"$HOME/.api_keys"
)
for file in "${ENV_FILES[@]}"; do
if [ -f "$file" ]; then
source "$file"
echo "Loaded: $file"
fi
done
EOF
Modern Approaches: Using .env Files
Docker-style .env Files
bash
thecloudstrap@ubuntu:~$ cat > .env << 'EOF' # Application configuration APP_NAME=MyApplication APP_VERSION=1.0.0 DEBUG=false # Database configuration DATABASE_URL=postgresql://user:pass@localhost:5432/mydb REDIS_URL=redis://localhost:6379 # External services STRIPE_API_KEY=sk_test_xxxxxxxx SENDGRID_API_KEY=SG.xxxxxxxx EOF # Load .env file thecloudstrap@ubuntu:~$ set -a; source .env; set +a
Automated .env Loading
bash
thecloudstrap@ubuntu:~$ nano ~/.bashrc
# Auto-load .env file in project directories
load_dotenv() {
if [ -f ".env" ]; then
set -a
source .env
set +a
echo "Loaded .env from $(pwd)"
fi
}
# Call load_dotenv when changing directories
cd() {
builtin cd "$@"
load_dotenv
}
Conclusion: Mastering Environment Variables
Environment variables are powerful tools that provide flexibility and control over your Linux system and applications. By understanding the different methods of setting variables—temporary vs. permanent, user-specific vs. system-wide—you can create robust, configurable, and maintainable systems.
Key Takeaways:
- Use temporary variables for session-specific testing
- Store permanent variables in appropriate configuration files
- Organize variables logically by purpose and scope
- Follow security best practices for sensitive information
- Document your variables for future reference
- Use modern approaches like .env files for application configuration
Remember that environment variables form the foundation of system and application configuration in Linux. Mastering their use will make you more efficient in system administration, development, and automation tasks. Practice setting different types of variables in various scenarios to build confidence and develop your preferred workflow.
The flexibility and power of environment variables make them indispensable tools in the Linux ecosystem. Whether you’re configuring a development environment, deploying applications, or tuning system performance, proper environment variable management will significantly enhance your productivity and system reliability.
This post was published by Admin.
Email: admin@TheCloudStrap.Com
