diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go
index be3ced3761142e6db3c3101dcfa28165f5e04411..3f859392d369665f361436b3aa4472a45b9ea717 100644
--- a/cmd/helm/helm.go
+++ b/cmd/helm/helm.go
@@ -158,7 +158,12 @@ func init() {
 func main() {
 	cmd := newRootCmd(os.Args[1:])
 	if err := cmd.Execute(); err != nil {
-		os.Exit(1)
+		switch e := err.(type) {
+		case pluginError:
+			os.Exit(e.code)
+		default:
+			os.Exit(1)
+		}
 	}
 }
 
diff --git a/cmd/helm/load_plugins.go b/cmd/helm/load_plugins.go
index f4c97bde7031e82bca8773d12c3dc7c3ef4994cd..67de8bae537a153e025141fab5f1491927dc4520 100644
--- a/cmd/helm/load_plugins.go
+++ b/cmd/helm/load_plugins.go
@@ -22,12 +22,18 @@ import (
 	"os/exec"
 	"path/filepath"
 	"strings"
+	"syscall"
 
 	"github.com/spf13/cobra"
 
 	"k8s.io/helm/pkg/plugin"
 )
 
+type pluginError struct {
+	error
+	code int
+}
+
 // loadPlugins loads plugins into the command list.
 //
 // This follows a different pattern than the other commands because it has
@@ -87,7 +93,11 @@ func loadPlugins(baseCmd *cobra.Command, out io.Writer) {
 				if err := prog.Run(); err != nil {
 					if eerr, ok := err.(*exec.ExitError); ok {
 						os.Stderr.Write(eerr.Stderr)
-						return fmt.Errorf("plugin %q exited with error", md.Name)
+						status := eerr.Sys().(syscall.WaitStatus)
+						return pluginError{
+							error: fmt.Errorf("plugin %q exited with error", md.Name),
+							code:  status.ExitStatus(),
+						}
 					}
 					return err
 				}