How to add subshell support for ash
Alexander Kriegisch
kriegaex at freetz.org
Sat Mar 3 17:39:56 UTC 2012
Never mind, I am one step further:
> case ASH:
> /* ash does not support precmd, we need to read cwd from the prompt */
> g_snprintf (precmd, sizeof (precmd),
> "PS1='$(pwd>&%d; kill -STOP $$)\\u@\\h:\\w\\$ '\n", subshell_pipe[WRITE]);
> break;
This works for BusyBox ash (tested on mipsel platform). The command will
be contained in the shell editing history, but for me this is acceptable.
The next thing I want to do is set ENV so as to enable loading my shell
profile without having to use a login shell. This would be the
equivalent to Bash's "-rcfile" parameter. I did this:
> case ASH:
> /* Do we have a custom init file ~/.local/share/mc/ashrc? */
> init_file = mc_config_get_full_path ("ashrc");
>
> /* Otherwise use ~/.profile */
> if (access (init_file, R_OK) == -1)
> {
> g_free (init_file);
> init_file = g_strdup (".profile");
> }
>
> /* Put init file to ENV variable used by ash */
> char *putenv_str = g_strconcat ("ENV=", init_file, NULL);
> putenv (putenv_str);
> g_free (putenv_str);
>
> break;
And later this:
> /* TODO for upstream patch: Execute correct ash/dash/busybox shell (not necessary for Freetz) */
> case ASH:
> execl (shell, "sh", (char *) NULL);
> break;
The problem is that ENV seems to be unset in my subshell's environment,
i.e. that ~ /.profile (whiche exists) is not evaluated. Do I need to
somehow export the ENV variable to make it available to the subshell?
BTW, I am compiling against uClibc 0.9.29, if this is relevant.
Alexander Kriegisch, 03.03.2012 14:41:
> I am on an embedded environment. Bash is available as a separate
> package, but huge in comparison with the built-in ash of BusyBox.
>
> Disclaimer before I continue: I am *not* a C programmer. I can read
> a bit of C, but not develop anything meaningful other than copy,
> paste and modify existing code. So bear with me anyway, if you
> please.
>
> I looked into src/subshell.c and tried to figure out what happens
> there. I have started to add ash support, but MC seems to depend on
> PROMPT_COMMAND/precmd/fish_prompt, i.e. on a function or alias which
> is executed each time just before a prompt is printed. Ash does not
> have anything like that, AFAIK. If I understand correctly, using
> those pre-commands are MC's way of determining the cwd. I wonder why
> you do not just use something like pwd or $PWD, but OTOH I do not
> understand the difficulties of corresponding with the subshell.
>
> Anyway, in my case it would be absolutely fine to set a fixed value
> of PS1='\w\$ ' for the subshell and read the cwd from the prompt. In
> any case it would be better than not having the option of using ash
> as a subshell at all.
>
> Could anyone maybe provide me with a code snippet or a patch which
> shows me how to extract the cwd from the prompt assuming that PS1 has
> the value '\w\$ '? (BTW, '\$' will be evaluated to '$' or '#' in
> ash, depending on whether you are root or not.)
>
> Thank you so much. If I succeed in adding ash as a subshell, I will
> provide a (raw) patch for you to inspect and maybe refine and
> include upstream.
More information about the mc-devel
mailing list