Site Map - skip to main content

Hacker Public Radio

Your ideas, projects, opinions - podcasted.

New episodes every weekday Monday through Friday.
This page was generated by The HPR Robot at

hpr3013 :: Bash Tips - 21

Environment variables

<< First, < Previous, , Latest >>

Thumbnail of Dave Morriss
Hosted by Dave Morriss on 2020-02-19 is flagged as Explicit and is released under a CC-BY-SA license.
Bash, variable, environment, environment variable. 4.
The show is available on the Internet Archive at:

Listen in ogg, spx, or mp3 format. Play now:

Duration: 00:41:37

Bash Scripting.

This is an open series in which Hacker Public Radio Listeners can share their Bash scripting knowledge and experience with the community. General programming topics and Bash commands are explored along with some tutorials for the complete novice.

The Environment (More collateral Bash tips)


You will probably have seen references to The Environment in various contexts relating to shells, shell scripts, scripts in other languages and compiled programs.

In Unix and Unix-like operating systems an environment is maintained by the shell, and we will be looking at how Bash deals with this in this episode. When a script, program or subprocess is invoked it is given an array of strings called the environment. This is a list of name-value pairs, of the form name=value.

Using the environment

The environment is used to convey various pieces of information to the executing script or program. For example, two standard variables provided by the shell are 'HOME', which is set to the current user’s home directory and 'PWD, set to the current working directory. The shell user can set, change, remove and view environment variables for their own purposes as we will see in this episode. The Bash shell itself creates and in some cases manages environment variables.

The environment contains global data which is passed down to subprocesses (child processes) by copying. However, it is not possible for a subprocess to pass information back to the superior (parent) process.

Viewing the environment

You can view the environment in a number of ways.

  • From the command line the command printenv can do this (this is usually but not always a stand-alone command: it’s /usr/bin/printenv on my Debian system). We will look at this command later.

  • The command env without any arguments does the same thing as printenv without arguments. This is actually a tool to run a program in a modified environment which we will look at later. The environment printing capability can be regarded as more of a bonus feature.

  • Scripting languages like awk (as well as Python and Perl, to name just a few) can view and manipulate the environment.

  • Compiled languages such as C can do this too of course.

  • There are other commands that will show the environment, and we will look at some of these briefly.

Changing variables in the environment

The variables in the environment are not significantly different from the shell parameters we have seen throughout this Bash Tips series. The only difference is that they are marked for export to commands and sub-shells. You will often see variables (or parameters) in the environment referred to as environment variables. The Bash manual makes a distinction between ordinary parameters (variables) and environment variables, but many other sources are less precise about this in my experience.

The standard variables in the environment have upper-case names (HOME, SHELL, PWD, etc), but there is no reason why a variable you create should not be in lower or mixed case. In fact, the Bash manual suggests that you should avoid using all upper-case names so as not to clash with Bash’s variables.

Variables can be created and changed a number of ways.

  • They can be set up at login time (globally or locally) through various standard configuration files. It is intended to look at this subject in an upcoming episode so we will leave discussing the subject until then.
  • By preceding the command or script invocation with name=value expressions which will temporarily place these variables into the environment for the command
  • Using the export command
  • Using the declare command with the -x option
  • The value of an environment variable (once established) can be changed at any time in the sub-shell with a command like myvar=42, just as for a normal variable
  • The export command can also be used to turn off the export marker on a variable
  • Deletion is performed with the unset command (as seen earlier in the series)

We will look at all of these features in more detail later in the episode.

Long notes

I have provided detailed notes as usual for this episode, and these can be viewed here.


Subscribe to the comments RSS feed.

Comment #1 posted on 2020-02-24 12:18:26 by crvs

So that's how you use shebangs!

After all these years I finally understand how you write an awk script! Thank you!

Comment #2 posted on 2020-02-24 12:55:39 by Dave Morriss

Writing awk scripts

Glad the episode was helpful.

In case you missed it, there is a series "Learning Awk" on HPR which you can find here:

This has been restructured for publication on, starting at

Comment #3 posted on 2020-05-22 11:36:56 by nobody


Personally I feel like the best and most complete resource for learning AWK is the gawk manual:

Comment #4 posted on 2020-05-22 21:40:04 by Dave Morriss

Response to 'nobody' re awk

Thank you for your feedback. If I interpret you correctly I think you may have misunderstood the spirit of my earlier comment.

I was replying to crvs when he mentioned the use of shebangs in the context of writing awk scripts. I took him to mean that this particular episode had helped to provide an insight which assisted with his understanding.

In my reply I pointed to the series that b-yeezi and I had done on awk where we'd tried to introduce people to this tool and had made many many references to the gawk manual along the way of course.

There is no contest with the gawk manual itself, if that is what you were implying. The manual is obviously the most comprehensive and definitive resource on the utility and the language. The resource which b-yeezi and I had tried to provide was simply a way into concepts which may have been daunting and somewhat inaccessible to some.

Our role was one of supplementing the manual itself, not of superseding it in any way.

I hope this clarifies any misunderstanding there may have been.

Leave Comment

Note to Verbose Commenters
If you can't fit everything you want to say in the comment below then you really should record a response show instead.

Note to Spammers
All comments are moderated. All links are checked by humans. We strip out all html. Feel free to record a show about yourself, or your industry, or any other topic we may find interesting. We also check shows for spam :).

Provide feedback
Your Name/Handle:
Anti Spam Question: What does the letter P in HPR stand for?
Are you a spammer?
What is the HOST_ID for the host of this show?
What does HPR mean to you?