在shell中通过Python脚本更改工作目录
我想实现一个用户命令,这个命令会接收一个参数(路径),然后把当前目录切换到这个路径。程序执行完后,我希望命令行能够停留在这个目录里。所以我想实现一个 cd
命令,但用外部程序来完成。
这个可以用 Python 脚本来实现吗,还是说我必须写一个 bash 包装器?
举个例子:
tdi@bayes:/home/$>python cd.py tdi
tdi@bayes:/home/tdi$>
6 个回答
2
正如codaddict所说,在你的子shell中发生的事情不会影响到父shell。不过,如果你的目的是让用户在不同的目录下使用shell,你可以让Python使用 os.chdir
来改变子shell的工作目录,然后从Python启动一个新的 shell。这样做不会改变原始shell的工作目录,但会让用户在一个不同的目录下使用shell。
5
这是不可能的。
你的脚本是在一个由父命令行(也就是你输入命令的地方)启动的子命令行中运行的。
在这个子命令行中执行的任何cd
命令都不会影响到父命令行。
23
其他人已经指出,你不能从子进程改变父进程的工作目录。
不过,有一种方法可以实现你的目标——如果你在一个 shell 函数中使用 cd 命令,它是可以改变工作目录的。你可以把以下内容添加到你的 ~/.bashrc 文件中:
go() {
cd "$(python /path/to/cd.py "$1")"
}
你的脚本应该打印出你想要切换到的目录路径。例如,这可以是你的 cd.py 文件:
#!/usr/bin/python
import sys, os.path
if sys.argv[1] == 'tdi': print(os.path.expanduser('~/long/tedious/path/to/tdi'))
elif sys.argv[1] == 'xyz': print(os.path.expanduser('~/long/tedious/path/to/xyz'))
然后你可以这样做:
tdi@bayes:/home/$> go tdi tdi@bayes:/home/tdi$> go tdi