add auto mode for shell based on SHELL env var and support zsh
This commit is contained in:
parent
df5cc1da84
commit
eb5b88052e
@ -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"))
|
||||
}
|
||||
|
44
cli/shell.go
44
cli/shell.go
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user