Learning Center
Linux

How to Set and Manage Linux Environment Variables

3 Apr 2025
Umair Khurshid
Umair Khurshid

Environment variables are a core component of Linux, enabling users and system processes to store configuration values dynamically. They influence everything from command execution to system-wide settings, making them essential for both interactive sessions and automated processes.  

This guide explores setting and managing env variables, troubleshooting issues, securing sensitive data, and optimizing Linux systems through effective variable management. 

And if you’re looking for a reliable, high-performance, and budget-friendly solution for your workflows, Hostman has you covered with Linux VPS Hosting options, including Debian VPS, Ubuntu VPS, and VPS CentOS.

What Are Environment Variables?
Copy link

An environment variable is a named value stored in system memory, affecting how processes behave. For example, when executing a command, the system references the PATH variable to locate the correct executable. 

To display all active variables:  

printenv

Image3

To retrieve a specific value:  

echo $HOME

51034b94 Bbd8 434d 875d 143e2f328b0e

There are two primary types of environment variables:  

  • Session-based: Exists only in the current terminal session.  
  • Persistent: Stored in configuration files to remain active after logout or reboot.  

Understanding how these variables function ensures smooth system operation and script automation.  

Setting Environment Variables
Copy link

A temporary variable can be assigned using:  

export TEMP_VAR="Temporary Value"

To check if it was set:  

echo $TEMP_VAR

8b480279 C128 4ffe 854d 7a79e08d2b1d

This variable exists only in the current session. Once the shell is closed, it disappears.  

To create a persistent variable, append it to ~/.bashrc:  

echo 'export PERSISTENT_VAR="Stored Across Sessions"' >> ~/.bashrc && source ~/.bashrc

For system-wide settings, define variables in /etc/environment:  

echo 'GLOBAL_VAR="Available to All Users"' | sudo tee -a /etc/environment

A reboot or reloading the file ensures the changes take effect.  

Using Environment Variables in Shell Scripts
Copy link

Scripts frequently rely on environment variables to pass configurations dynamically. Understanding their scope and behavior is key to avoiding unintended side effects.

Defining and Accessing Variables in Scripts

A variable can be defined within a script as follows:

#!/bin/bash
MY_VAR="Hello, World"
echo $MY_VAR

However, this variable exists only inside the script. Running it does not make MY_VAR available in the parent shell.

Exporting Variables for External Use

To make a variable accessible to child processes:

export GLOBAL_VAR="Persistent Value"
./my_script.sh

Da8131be E10c 4f20 87ee 7c82efcb5a31

Inside my_script.sh, the variable will be available. Without export, the script would not inherit the variable.

Sourcing a Script to Modify the Current Shell Environment

A script cannot modify the parent shell’s environment unless explicitly sourced:

source my_script.sh

or

. my_script.sh

C8f589d6 40db 411d A7e6 4de09fa28bca

This method is useful for setting persistent configurations dynamically.

Preventing Variable Collisions in Scripts

If multiple scripts use generic names like TEMP or DATA, unexpected conflicts can occur. Prefixing variables uniquely avoids this issue:

APP1_TEMP="value"
APP2_TEMP="value"

Alternatively, using local variables within functions prevents global namespace pollution:

my_function() {
    local TEMP_VALUE="Temporary Data"
    echo $TEMP_VALUE
}

By keeping variables properly scoped, script behavior remains predictable.

Managing Environment Variables in Cron Jobs
Copy link

Cron jobs run on predefined schedules but operate in a minimal shell environment, often missing user-defined env variables. This leads to common issues when using variables inside cron scripts.

Unlike interactive shells, cron jobs do not load user profiles like ~/.bashrc or /etc/profile. Running a job that depends on custom variables may fail unless explicitly defined.

To check cron’s default environment:

env -i /bin/bash -c 'printenv'

Sdfvsdgv

This command runs a clean shell without inherited variables, mimicking cron behavior.

Defining Variables in Crontab

To ensure a variable is available in a cron job, define it within the crontab file:

MY_VAR="Scheduled Value"
* * * * * echo $MY_VAR >> /tmp/output.log

This approach works for simple variables but does not support complex setups.

Using an Environment File in Cron Jobs

For multiple variables, store them in a file and source it in the cron job:

* * * * * source /home/user/my_env_vars.sh && /home/user/my_script.sh

Alternatively, define the BASH_ENV variable to ensure the script loads the environment:

BASH_ENV="/home/user/my_env_vars.sh"
* * * * * /home/user/my_script.sh

This method ensures a consistent environment for all scheduled tasks.

Ensuring PATH Is Correctly Set

Many cron job failures occur due to an incomplete PATH. To prevent this, define it explicitly:

PATH="/usr/local/bin:/usr/bin:/bin"
* * * * * /home/user/my_script.sh

This avoids issues where commands work in a terminal but fail when run as a cron job.

Debugging Environment Variable Issues
Copy link

If an env variable does not behave as expected, diagnosing the issue requires structured debugging.  

Confirming a Variable Is Set

To check if a variable exists:  

printenv VAR_NAME

If no output appears, the variable is unset or not exported.  

To verify if it exists only in the shell:  

set | grep VAR_NAME

Checking If a Variable Is Exported

A variable may be available in the current shell but not inherited by subprocesses. To check:  

bash -c 'echo $VAR_NAME'

If the output is empty, ensure the variable is exported:  

export VAR_NAME="Value"

Identifying Conflicting Variables

If a variable does not behave as expected, another definition may be overriding it. To locate all instances:  

grep VAR_NAME ~/.bashrc ~/.profile /etc/environment

If multiple definitions exist, remove any unintended ones.  

Testing Variables in a Clean Environment

To check if an issue is related to the shell configuration, launch a clean session and then, try setting and printing the variable again 

env -i bash --noprofile --norc

Using Environment Variables in Systemd Services
Copy link

Many Linux services run as systemd units. Instead of defining env variables in shell scripts, systemd provides a structured way to manage them.  

To set env variables for a systemd service, create a drop-in configuration file:  

sudo mkdir -p /etc/systemd/system/my_service.service.d && echo -e "[Service]\nEnvironment=\"MY_VAR=MyValue\"" | sudo tee /etc/systemd/system/my_service.service.d/env.conf

Add the content and modify ExecStart as needed:

[Unit]
Description=My Custom Service
After=network.target

[Service]
ExecStart=/path/to/your/executable
Restart=always
Environment="MY_VAR=MyValue"

[Install]
WantedBy=multi-user.target

Reload systemd and restart the service:  

sudo systemctl daemon-reload
sudo systemctl restart my_service

To confirm that the variable was applied:  

sudo systemctl show my_service | grep MY_VAR

F7d8e096 C982 4833 8a3a 801183c55f1e

This method ensures that variables persist across reboots without modifying global shell configuration files.  

Environment Variables and Performance Optimization
Copy link

Env variables affect performance by controlling system behavior at a fundamental level. Configuring them effectively can enhance efficiency and streamline resource management.

Optimizing Command Execution Paths

The PATH variable determines where the system looks for executables. If it contains unnecessary directories, command execution slows down. To optimize:  

export PATH="/usr/local/bin:/usr/bin:/bin"

Avoid overly long PATH values by removing redundant or unused paths.  

Reducing Memory Usage with LD_LIBRARY_PATH

Dynamic linking relies on the LD_LIBRARY_PATH variable. Setting unnecessary paths increases lookup time for shared libraries. Optimize by ensuring only required paths are included:  

export LD_LIBRARY_PATH="/usr/local/lib:/usr/lib"

Adjusting Process Priorities with OOM_SCORE_ADJ

The OOM_SCORE_ADJ variable influences how the Out-of-Memory (OOM) killer prioritizes processes for termination. For critical processes, reduce their likelihood of being killed:

echo -1000 | sudo tee /proc/$(pgrep my_critical_process)/oom_score_adj

Conversely, assign a high value to non-essential processes to allow them to be terminated first:

echo 500 | sudo tee /proc/$(pgrep background_task)/oom_score_adj

These optimizations improve system responsiveness under heavy loads.

Linux Hardening Through Environment Variable Management 
Copy link

Improper use of env variables can expose sensitive information and create privilege escalation risks. Careful handling of these variables is essential, and using well-structured practices reduces potential risks.

Restricting Access to Configuration Files

Ensure that files storing env variables have restricted permissions:

chmod 600 ~/.bashrc ~/.profile

For system-wide files:

sudo chmod 644 /etc/environment

Preventing Path Manipulation Attacks

Malicious users can modify PATH to execute unintended commands. Instead of relying on cp file /backup/ always use absolute paths in scripts:

/usr/bin/cp file /backup/

Clearing Sensitive Variables

When handling credentials, remove them immediately after use:

unset API_KEY

This prevents them from being accessed through process listings or logs.

Wrapping Up
Copy link

Linux environment variables are essential for configuring system behavior, optimizing performance, and ensuring security. By understanding how they work across different shells, debugging issues efficiently, and applying security best practices, users can create a more robust and efficient system.

The inclusion of systemd service configurations, performance optimizations, containerized environments, and Linux hardening techniques ensures a well-rounded approach to env variable management. Mastering these topics provides greater control over Linux-based systems and enhances both usability and security.