在shell中通过Python脚本更改工作目录

18 投票
6 回答
9285 浏览
提问于 2025-04-16 04:33

我想实现一个用户命令,这个命令会接收一个参数(路径),然后把当前目录切换到这个路径。程序执行完后,我希望命令行能够停留在这个目录里。所以我想实现一个 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

撰写回答