---
title: Executing Elevated Commands in Your Current Environment
teaser: No more maintaining multiple versions of gems for your system Ruby!
tags: ruby,unix
author: Justin Kenyon
published_on: 2016-03-09
---

Recently [Blake Williams] and I were authoring a library for interacting
with the [Amazon Dash buttons] called [dashed]. For Dashed to work, you need
to listen to the requests that your network device can hear on the network it is
connected to. This is a restricted device and only can be listened to when you
run your commands with elevated privileges (e.g. `sudo [command]`). Running your
command with sudo will give you the proper access. However, since the sudo
command runs the subsequent commands in the system user's environment, it will
also be using the system user's Ruby installation. This can cause issues with
gems that are not present, Ruby version differences, and more.

You can solve this in a couple of different ways. For instance you can install
all of the gems your project needs in the system user's environment, and install
the correct version of Ruby there as well. What if you want to use an upgraded
version of a gem? You'll have to upgrade all the appropriate gems in your system
user's environment as well. How can you accomplish this in an easy way?

Looking at the output of `sudo --help` gives you a slew of options. One in
particular will solve the problem for us:

```sh
-E, --preserve-env          preserve user environment when running command
```

All you need is the `--preserve-env` option and all your environment variables
will be maintained when executing the elevated command.

[Blake Williams]: http://twitter.com/BlakeWilliams__
[dashed]: http://github.com/kenyonj/dashed
[Amazon Dash buttons]: http://www.amazon.com/oc/dash-button
