View all environment variables
env
printenv
export -p
View specific variable
echo $VARIABLE
printenv VARIABLE
env | grep VARIABLE
Set temporary variable (current shell)
VARIABLE=value
VARIABLE=value command
LANG=C ls /nonexistent
Export variable (child processes)
export VARIABLE=value
export PATH=/new/path:$PATH
VARIABLE=value
export VARIABLE
Common environment variables
PATH
HOME
USER
SHELL
PWD
OLDPWD
LANG
TERM
EDITOR
PAGER
PS1
View values
echo $PATH
echo $HOME
echo $USER
printenv PATH HOME USER
Modify PATH
export PATH=$PATH:/new/directory
export PATH=/new/directory:$PATH
export PATH=/usr/local/bin:/usr/bin:/bin
Unset variable
unset VARIABLE
unset PATH
Permanent environment variables
User-specific (~/.bashrc or ~/.profile)
export JAVA_HOME=/usr/lib/jvm/java-11
export PATH=$PATH:$JAVA_HOME/bin
source ~/.bashrc
System-wide (/etc/environment)
sudo vim /etc/environment
JAVA_HOME="/usr/lib/jvm/java-11"
CUSTOM_VAR="value"
Profile scripts
export CUSTOM_VAR=value
sudo chmod +x /etc/profile.d/custom.sh
ENV vs PRINTENV
printenv
printenv PATH
env VARIABLE=value command
env -i command
Run with clean environment
env -i bash
env -i HOME=$HOME USER=$USER bash
env -i /path/to/command
Set multiple variables
VAR1=value1 VAR2=value2 command
export VAR1=value1 VAR2=value2
env VAR1=value1 VAR2=value2 command
Variable expansion
echo $VARIABLE
echo ${VARIABLE}
echo ${VARIABLE:-default}
echo ${VARIABLE:=default}
echo ${VARIABLE:?error message}
echo ${VARIABLE:+alternative}
Check if variable is set
if [ -z "$VARIABLE" ]; then
echo "VARIABLE is not set"
fi
if [ -n "$VARIABLE" ]; then
echo "VARIABLE is set"
fi
if printenv VARIABLE > /dev/null 2>&1; then
echo "VARIABLE exists"
fi
Process-specific variables
cat /proc/PID/environ | tr '\0' '\n'
ps auxe | grep process-name
Scripting with environment
#!/bin/bash
: ${DATABASE_URL:?DATABASE_URL must be set}
: ${API_KEY:?API_KEY must be set}
: ${LOG_LEVEL:=INFO}
: ${PORT:=3000}
echo "Starting application on port $PORT"
echo "Log level: $LOG_LEVEL"
Load from .env file
#!/bin/bash
if [ -f .env ]; then
export $(cat .env | grep -v '^#' | xargs)
fi
set -a
source .env
set +a
.env file format
DATABASE_URL=postgresql://localhost/mydb
API_KEY=secret123
DEBUG=true
PORT=3000
Common patterns
Java
export JAVA_HOME=/usr/lib/jvm/java-11
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib
Node.js
export NODE_ENV=production
export NODE_OPTIONS="--max-old-space-size=4096"
Python
export PYTHONPATH=/path/to/modules:$PYTHONPATH
export VIRTUAL_ENV=/path/to/venv
Go
export GOPATH=$HOME/go
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
Security considerations
export PASSWORD=secret123
read -sp "Enter password: " PASSWORD
export PASSWORD
export DB_PASSWORD=$(cat /etc/secrets/db_password)
Debugging
export -p
set | grep -v '^_'
set -x
export VARIABLE=value
set +x
Cleanup script
#!/bin/bash
env > /tmp/env_before.txt
env > /tmp/env_after.txt
diff /tmp/env_before.txt /tmp/env_after.txt
Tips & best practices
echo "$VARIABLE"
echo $VARIABLE
export DATABASE_URL
export DB
: ${PORT:=3000}
if [ -z "$REQUIRED_VAR" ]; then
echo "Error: REQUIRED_VAR not set"
exit 1
fi
Quick reference
env
printenv VARIABLE
echo $VARIABLE
export VAR=value
VAR=value
VAR=value command
unset VAR
export PATH=$PATH:/new/path
export VARIABLE=value
VARIABLE=value