Jan 4, 2010

Exactly how is your development environment configured?

Along with Grails we are seeing a resurgence of the shell and the command line. And if there is anything experienced unix users hate, it’s asking a newbie how their environment is configured and getting a blank stare in return. Well I solved this problem years ago with a simple shell script — it’s time to resurrect printconfig. A call to printconfig shows the path and a subset of the shell’s environment variables. For example:

yaal.local[525]> printconfig
HOME		/Users/amiller
ANT_HOME	/Users/amiller/devtools/ant/current -> ant-1.7.1
CATALINA_HOME	/Users/amiller/devtools/tomcat/current -> tomcat-6.0.16
EMACS_HOME	/Users/amiller/devtools/emacs/carbon-emacs-22.3.1_2009.07.25.app
GRAILS_HOME	/Users/amiller/devtools/grails/current -> grails-1.2.0
GROOVY_HOME	/Users/amiller/devtools/groovy/current -> groovy-1.6.7
IVY_HOME	/Users/amiller/devtools/ivy/current -> ivy-2.1.0
JAVA_HOME	/Users/amiller/devtools/jdk/current -> jdk-1.6.0
JBOSS_HOME	/Users/amiller/devtools/jboss-4.0.5
MAVEN_HOME	/Users/amiller/devtools/maven/current -> maven-2.0.9
TOMCAT_HOME	/Users/amiller/devtools/tomcat/current -> tomcat-6.0.16
ANT_OPTS	-Xmx128m
JAVA_OPTS	-Xmx512m
MAVEN_OPTS	-Xmx2100m -Xms512m
PATH=.
     /Users/amiller/bin
     /Users/amiller/devtools/ant/current/bin
     /Users/amiller/devtools/emacs/carbon-emacs-22.3.1_2009.07.25.app/bin
     /Users/amiller/devtools/grails/current/bin
     /Users/amiller/devtools/groovy/current/bin
     /Users/amiller/devtools/jdk/current/bin
  ...

(See my post on Fast path switching between projects for an explanation of the “current” path elements.)

Call printconfig from the last line in your .profile and your new user shells will always show the environment as it is configured. Try it next time you’re debugging a shell’s environment and let me know what you think.

The printconfig script:

#!/bin/sh
#
# Echo some config info at shell startup time
# (useful when debugging the shell environment.)
#
# Preserve the intentionally HARD_TABS when editing!
#
echo "HOME		$HOME"

for home_var in `printenv | grep _HOME | sort`; do
    home_var_name=`echo $home_var | awk -F= '{ print $1 }'`
    home_var_value=`echo $home_var | awk -F= '{ print $2 }'`
    if [ -h $home_var_value ]; then
        # echo out what symbolic links are pointing to...
        echo "$home_var_name	`ls -l $home_var_value | awk '{ printf "%s -> %sn", $9, $11 }'`"
        #                   ^ hard tab
    else
        echo "$home_var_name	$home_var_value"
        #                   ^ hard tab
    fi
done

printenv | grep _OPTS | sort | sed 's/=/	/'
#                                       ^ hard tab

echo "PATH=$PATH" | sed 's/:/
     /g'

About the Author

Object Partners profile.

One thought on “Exactly how is your development environment configured?

  1. Josh Brown says:

    This is really cool – thanks for posting!

  2. Lukas Rossa says:

    Yes, Grails is great but it’s quite unfortunate that the tool support is still far behind mature languages such as Java and C# and we’re having to revert back to command line..
    I think this is the most annoying thing about new languages in general – they may be less verbose and do things smarter, you spend so much more time with basics such as project setup and environment and plugin configuration and test setup / running and wondering what was that command again to do XYZ.. because the IDE doesn’t do it yet…
    I’m looking towards the SpringSource Tool Suite to address this soon.
    Anyways, this is just my rant – thanks for this post.

Leave a Reply

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

Related Blog Posts
Android Development for iOS Developers
Android development has greatly improved since the early days. Maybe you tried it out when Android development was done in Eclipse, emulators were slow and buggy, and Java was the required language. Things have changed […]
Add a custom object to your Liquibase diff
Adding a custom object to your liquibase diff is a pretty simple two step process. Create an implementation of DatabaseObject Create an implementation of SnapshotGenerator In my case I wanted to add tracking of Stored […]
Keeping Secrets Out of Terraform State
There are many instances where you will want to create resources via Terraform with secrets that you just don’t want anyone to see. These could be IAM credentials, certificates, RDS DB credentials, etc. One problem […]
Validating Terraform Plans using Open Policy Agent
When developing infrastructure as code using terraform, it can be difficult to test and validate changes without executing the code against a real environment. The feedback loop between writing a line of code and understanding […]