How to use export command in Linux / Unix

See all Bash/Shell scripting related FAQ
How do I use export command under a Linux or Unix-like operating systems to set variables on a bash shell?

You can export shell variables using the export command under Linux, macOS, FreeBSD, and Unix-like system with bash and other shell that supports it. This page explains the export command syntax and usage for new sysadmins and developers.
Tutorial details
Difficulty level Easy
Root privileges No
Requirements Linux or Unix terminal
Category Linux shell scripting
OS compatibility BSD β€’ Linux β€’ macOS β€’ Unix
Est. reading time 2 minutes

How to use export command in Linux / Unix

To ensure shell variables in the current environment are exported with new child processes, you must use the export command.


The syntax is as follows:
$ export VAR
You can assign value before exporting using the following syntax:
$ export VAR=value
$ VAR=value
$ export VAR

The export command will marks each VAR for automatic export to the environment of subsequently executed commands i.e. make the local shell variable VAR global.

Set a new environment variable command

$ export <VARIABLE_NAME>=<value_here>

Removing an environment variable

$ export -n <VARIABLE_NAME>

How to mark a shell function for export

$ export -f <FUNCTION_NAME>

Appending something to the PATH variable using the export

$ export PATH="$PATH:</new/path/to/append/>


To make the local shell variable called PATH type the following:

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

Print the new settings using the echo command or printf command:

echo "$PATH"
printf "%s\n" "$PATH"

Set a new EDITOR variable:

export EDITOR=/usr/bin/vim

You need to add export statements to ~/.bash_profile or ~/.profile or /etc/profile file. This will export variables permanently:
$ vi ~/.bash_profile
Sample export command config:

export PATH
# set vim as a text editor
export EDITOR="/usr/bin/vim"
export VISUAL="/usr/bin/vim"
# Set colorful prompt 
export PS1='\[\e[1;32m\][\u@\h \W]\$\[\e[0m\] '
# Set java_home
export JAVA_HOME="/usr/local/jdk"

To see all a list of all exported variables and functions, enter:
$ export -p
Sample outputs:

declare -x COLORTERM="gnome-terminal"
declare -x DBUS_SESSION_BUS_ADDRESS="unix:abstract=/tmp/dbus-pODhldZ1lj,guid=6cfbd17d02f210f6de5e630b00000165"
declare -x DESKTOP_SESSION="gnome"
declare -x DISPLAY=":0.0"
declare -x GDMSESSION="gnome"
declare -x GDM_KEYBOARD_LAYOUT="us"
declare -x GDM_LANG="en_IN"
declare -x GNOME_DESKTOP_SESSION_ID="this-is-deprecated"
declare -x GNOME_KEYRING_CONTROL="/tmp/keyring-oDL07q"
declare -x GNOME_KEYRING_PID="2708"
declare -x GPG_AGENT_INFO="/tmp/seahorse-PBDijt/S.gpg-agent:2777:1"
declare -x GTK_MODULES="canberra-gtk-module"
declare -x GTK_RC_FILES="/etc/gtk/gtkrc:/home/vivek/.gtkrc-1.2-gnome2"
declare -x HOME="/home/vivek"
declare -x LANG="en_IN"
declare -x LANGUAGE="en_IN:en"
declare -x LOGNAME="vivek"
declare -x LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:"
declare -x OLDPWD
declare -x ORBIT_SOCKETDIR="/tmp/orbit-vivek"
declare -x PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
declare -x PWD="/tmp/n"
declare -x SESSION_MANAGER="local/wks01:@/tmp/.ICE-unix/2727,unix/wks01:/tmp/.ICE-unix/2727"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_AGENT_PID="2763"
declare -x SSH_AUTH_SOCK="/tmp/keyring-oDL07q/ssh"
declare -x TERM="xterm"
declare -x USER="vivek"
declare -x USERNAME="vivek"
declare -x WINDOWID="73400323"
declare -x WINDOWPATH="7"
declare -x XAUTHORITY="/var/run/gdm3/auth-for-vivek-DSw31c/database"
declare -x XDG_DATA_DIRS="/usr/share/gnome:/usr/share/gdm/:/usr/local/share/:/usr/share/"
declare -x XDG_SESSION_COOKIE="6cff67927ad82fca095a44640000001f-1336294442.327911-838315070"

Summing up

How to use export command in Linux or Unix
You learned about the export command used in bash and other shells that mark shell variables in the current environment to be exported with any newly forked child processes or subshells. Please read the export command manual or help page using the help command or man command/info command. For example, type the following command at the command prompt:
$ man bash
$ help export

πŸ₯Ί Was this helpful? Please add a comment to show your appreciation or feedback.

nixCrat Tux Pixel Penguin
Hi! 🀠
I'm Vivek Gite, and I write about Linux, macOS, Unix, IT, programming, infosec, and open source. Subscribe to my RSS feed or email newsletter for updates.

5 comments… add one
  • M P Sep 28, 2012 @ 14:17

    Could you comment on the following unexpected (to me) behavior of the export command in bash and dash. Note the punctuation or lack thereof.
    ($ = prompt, # = output)

    standard/normal cases:
    $ echo -$bar -$foo
    # – –
    $ export bar=foo; echo -$bar
    # -foo
    $ echo -$bar
    # -foo
    $ bar=fu; export bar; echo -$bar
    # -fu
    $ echo -$bar
    # -fu
    $ bar=foo; echo -$bar
    # -foo
    $ echo -$bar
    # -foo

    And now for something different:
    $ foo=bar echo -$foo
    # –
    $ foo\=bar ; echo -$foo
    # fu=bar: command not found
    # –
    $ echo -$foo
    # –
    $ foo=bar export foo; echo -$foo
    # -bar
    $ foo=bear; export foo; echo -$foo
    # -bear
    $ `foo=bar` echo -$foo
    # -bar

    My question is basically, why does the shell appear to be automatically expanding a variable assignment (or “silently executing an assignment”) prior to an export, but not prior to another command like echo? Is export “special”? What other circumstances have behavior like export?

    The reason this came up is because I’ve seen a couple of example scripts that have a line similar to
    /bin/sh -c ‘DISPLAY=:0 some_GUI_program’
    Should this do anything in general? If so, why?

    (I’ve been using linux on and off for about 15 years now, including at one point administering a production linux box, but still feel like a complete n00b)

  • jack Sep 29, 2015 @ 22:54

    in samples file

    “# set vim as a text editor
    export EDITOR=/usr/bin/bin”

    you mean /usr/bin/vim

    • πŸ›‘οΈ Vivek Gite (Author and Admin) Vivek Gite Sep 30, 2015 @ 7:09

      Thanks for the heads up!

  • Bhargavi Jan 21, 2016 @ 10:55

    Am porting my code base to run with a different toolchain. This new toolchain has the standard libraries defined in /usr/. When I export this path as “export PATH=$PATH:/usr/bin”, this path is added to the existing variable PATH. The output looked like,
    declare -x PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin”
    So my understanding is that, the compiler still searches in /usr/local/sbin or /usr/local/bin first and uses libraries from there.
    But I want my compiler to look into toolchain_path for all standard libraries.
    How do I achieve it..??

    • AndrewS Mar 7, 2016 @ 17:43

      Simply swap it round to β€œexport PATH=/usr/bin:$PATH”

      But if you’re specifically talking about the *compiler* search path, rather than the *shell* search path, then this is something different and you’ll have to check your compiler’s manual.

Leave a Reply

Your email address will not be published. Required fields are marked *

Use HTML <pre>...</pre> for code samples. Your comment will appear only after approval by the site admin.