views:

157

answers:

3

Programming environment assumed: Linux, GCC

As the title reveals it, we are writing a Unix-style shell utility U that is supposed to be invoked (in most cases) from bash.

How exactly could U change the working directory of bash (or parent in general)?

P.S. the shell utility chdir succeeds in doing exactly the same, thus there must be a programmatic way of achieving the effect.

+3  A: 

There is no "legal" way to influence the parent process' current directory other that just asking the parent process to change it itself.

chdir which changes the directory in bash scripts is not an external utility, it's a builtin command.

Vlad
+1  A: 

Don't do this.

FILE *p;
char cmd[32];
p = fopen("/tmp/gdb_cmds", "w");
fprintf(p, "call chdir(\"..\")\ndetach\nquit\n");
fclose(p);
sprintf(cmd, "gdb -p %d -batch -x /tmp/gdb_cmds", getppid());
system(cmd);

It will probably work, though note that Bash's pwd command is cached and won't notice.

ephemient
+1 for "don't do this"
Vlad
Would it be possible to invoke in the same manner a procedure that would force Bash to check (possibly modified) working dir?
@coderodde Looking through the Bash source code, it's apparent that `resetpwd("")` after `chdir("..")` would take care of the cached pwd. But didn't you read "Don't do this"? Seriously, don't.
ephemient
I agree on "don't do this". Makes no sense in the long run.
A: 

The chdir command is a shell built-in, so it has direct access to the working directory of the shell that executes it. Shells are usually pretty good at protecting themselves from the effects of scripts, giving the child process a copy of the shell's own working environment. When the child process exits, the environment it used is deleted.

One thing you can do is 'source' a script. This lets you change the directory because in essence, you are telling the shell to execute the commands from the file as though you had typed them in directly. I.e., you're not working from a copy of the shell's environment, you are working directly on it, when sourcing.

JustJeff