Is there a way to make the exec system call work like a function call that returns instead of totally replacing the current process image? My motivation is trying to integrate two shells with incompatible languages. The idea is that shell A would be able to execute scripts written in the shell B language and still keep any changes to the environment variables, working directory, etc that the shell B script makes.

So far all the solutions I could think of have some big limitations.

The first solution is to have shell A exec into shell B and then have shell B exec back into shell A, like I do in this question I asked earlier. The problem is that this throws away any state from the initial shell A process, such as the position in the currently running script, local variables, aliases, etc.

The second solution is to have shell A run shell B as a traditional subprocess using fork-exec and have shell B serialize its environment just before it exits and send it back to the shell A process. Two upsides of this are that it preserves the state of the parent process and that we can also serialize application-level data such as functions and aliases if we want to. The problem is that there is a a lot of stuff that a subprocess inherits from the parent and its hard to make sure that we didn't forget to serialize one of those.

See there for an attempt at your second solution in bash (in that case, that was to switch user as opposed to switching shell)
– Stéphane ChazelasMay 19 '15 at 20:58

1

A 3rd solution would be to use a shell that can emulate other shells like zsh (it can't emulate fish but it has many of the features of fish and many more, and can interpret most ksh/bash scripts when in ksh emulation)
– Stéphane ChazelasMay 19 '15 at 20:59

When you declare a function in bash, should it be automatically translated to an equivalent fish function and vis-versa?
– Stéphane ChazelasMay 19 '15 at 21:01

haha, you are not going to make me change my shell so easily and this question is more about wondering whats possible in Unix anyway :) As for point #3, its OK if you throw away functions defined in the shell B script since I'm kind of assuming that A and B can be general executables.
– hugomgMay 19 '15 at 21:19