views:

103

answers:

4

I want to implement a userland command that will take one of its arguments (path) and change the directory to that dir. After the program completion I would like the shell to be in that directory. So I want to implement cd command, but with external program.

Can it be done in a python script or I have to write bash wrapper?

Example:

tdi@bayes:/home/$>python cd.py tdi
tdi@bayes:/home/tdi$>
+3  A: 

That is not going to be possible.

Your script runs in a sub-shell spawned by the parent shell where the command was issued.

Any cding done in the sub-shell does not affect the parent shell.

codaddict
A: 

As codaddict writes, what happens in your sub-shell does not affect the parent shell. However, if your goal is present the user with a shell in a different directory, you could always have Python use os.chdir to change the sub-shell's working directory and then launch a new shell from Python. This will not change the working directory of the original shell, but will leave the user with one in a different directory.

gspr
+4  A: 

Others have pointed out that you can't change the working directory of a parent from a child.

But there is a way you can achieve your goal -- if you cd from a shell function, it can change the working dir. Add this to your ~/.bashrc:

function go()
{
    cd $(python /path/to/cd.py "$1")
}

Your script should print the path to the directory that you want to change to. For example, this could be your cd.py:

#!/usr/bin/python
import sys
if sys.argv[1] == 'tdi': print '~/long/tedious/path/to/tdi'
elif sys.argv[1] == 'xyz':  print '~/long/tedious/path/to/xyz'

Then you can do:

tdi@bayes:/home/$> go tdi
tdi@bayes:/home/tdi$> go tdi
bstpierre
thanks, i just wanted to be clear about that.
tdi
A: 

cd is exclusively(?) implemented as a shell internal command, because any external program cannot change parent shell's CWD.

anilmwr