--- a/lib/shell.c +++ b/lib/shell.c @@ -68,6 +68,8 @@ mc_shell_get_installed_in_system (void) mc_shell->path = g_strdup ("/bin/bash"); else if (access ("/bin/ash", X_OK) == 0) mc_shell->path = g_strdup ("/bin/ash"); + else if (access ("/bin/mksh", X_OK) == 0) + mc_shell->path = g_strdup ("/bin/mksh"); else if (access ("/bin/dash", X_OK) == 0) mc_shell->path = g_strdup ("/bin/dash"); else if (access ("/bin/busybox", X_OK) == 0) @@ -149,6 +151,12 @@ mc_shell_recognize_real_path (mc_shell_t mc_shell->type = SHELL_ZSH; mc_shell->name = "zsh"; } + else if (strstr (mc_shell->path, "/mksh") != NULL + || strstr (mc_shell->real_path, "/mksh") != NULL) + { + mc_shell->type = SHELL_MKSH; + mc_shell->name = "mksh"; + } else if (strstr (mc_shell->path, "/tcsh") != NULL || strstr (mc_shell->real_path, "/tcsh") != NULL) { --- a/lib/shell.h +++ b/lib/shell.h @@ -16,6 +16,7 @@ typedef enum SHELL_BASH, SHELL_ASH_BUSYBOX, /* BusyBox default shell (ash) */ SHELL_DASH, /* Debian variant of ash */ + SHELL_MKSH, SHELL_TCSH, SHELL_ZSH, SHELL_FISH --- a/src/subshell/common.c +++ b/src/subshell/common.c @@ -378,6 +378,11 @@ init_subshell_child (const char *pty_nam } break; + case SHELL_MKSH: + init_file = g_strdup (".shrc"); + g_setenv ("ENV", init_file, TRUE); + break; + /* TODO: Find a way to pass initfile to TCSH and FISH */ case SHELL_TCSH: case SHELL_FISH: @@ -427,6 +432,7 @@ init_subshell_child (const char *pty_nam case SHELL_ASH_BUSYBOX: case SHELL_DASH: + case SHELL_MKSH: case SHELL_TCSH: case SHELL_FISH: execl (mc_global.shell->path, mc_global.shell->path, (char *) NULL); @@ -1091,6 +1097,10 @@ init_subshell_precmd (char *precmd, size "PS1='\\u@\\h:\\w\\$ '\n", command_buffer_pipe[WRITE], command_buffer_pipe[WRITE], subshell_pipe[WRITE]); break; + case SHELL_MKSH: + g_snprintf (precmd, buff_size, + "PS1='$(pwd>&%d; kill -STOP $$)'\"$((( USER_ID )) && print '$ ' || print '# ')\"\n", subshell_pipe[WRITE]); + break; case SHELL_ASH_BUSYBOX: /* BusyBox ash needs a somewhat complicated precmd emulation via PS1, and it is vital