add auto mode for shell based on SHELL env var and support zsh

pull/70/head
iwilltry42 5 years ago
parent df5cc1da84
commit eb5b88052e
  1. 7
      cli/commands.go
  2. 44
      cli/shell.go
  3. 2
      main.go

@ -354,10 +354,7 @@ func GetKubeConfig(c *cli.Context) error {
return nil
}
// Shell starts a new subshell with the KUBECONFIG pointing to the selected cluster
func Shell(c *cli.Context) error {
if c.String("shell") != "bash" {
return fmt.Errorf("%s is not supported. Only bash is supported", c.String("shell"))
}
return bashShell(c.String("name"), c.String("command"))
return shell(c.String("name"), c.String("shell"), c.String("command"))
}

@ -4,25 +4,63 @@ import (
"fmt"
"os"
"os/exec"
"path"
)
func bashShell(cluster string, command string) error {
var shells = map[string]map[string][]string{
"bash": {
"options": []string{
"--noprofile", // don't load .profile/.bash_profile
"--norc", // don't load .bashrc
},
},
"zsh": {
"options": []string{
"--no-rcs", // don't load .zshrc
},
},
}
// shell
func shell(cluster, shell, command string) error {
// check if the selected shell is supported
if shell == "auto" {
shell = path.Base(os.Getenv("SHELL"))
}
supported := false
for supportedShell := range shells {
if supportedShell == shell {
supported = true
}
}
if !supported {
return fmt.Errorf("ERROR: selected shell [%s] is not supported", shell)
}
// get kubeconfig for selected cluster
kubeConfigPath, err := getKubeConfig(cluster)
if err != nil {
return err
}
// check if we're already in a subshell
subShell := os.ExpandEnv("$__K3D_CLUSTER__")
if len(subShell) > 0 {
return fmt.Errorf("Error: Already in subshell of cluster %s", subShell)
}
bashPath, err := exec.LookPath("bash")
// get path of shell executable
shellPath, err := exec.LookPath(shell)
if err != nil {
return err
}
cmd := exec.Command(bashPath, "--noprofile", "--norc")
// set shell specific options (command line flags)
shellOptions := shells[shell]["options"]
cmd := exec.Command(shellPath, shellOptions...)
if len(command) > 0 {
cmd.Args = append(cmd.Args, "-c", command)

@ -61,7 +61,7 @@ func main() {
},
cli.StringFlag{
Name: "shell, s",
Value: "bash",
Value: "auto",
Usage: "Sub shell type. Only bash is supported. (default bash)",
},
},

Loading…
Cancel
Save