使用 python 脚本在父 shell 中 cd

使用 python 脚本在父 shell 中 cd

我想让我的 Python 程序cd通过终端作为父进程进入目录。有什么办法吗?

我希望发生这样的事情:

$ ./cd.py Desktop/scripts
$ pwd
/home/mfto/Desktop/scripts

提前致谢!

答案1

这是不可能的,你会发现这cd实际上不是一个“程序“在正常意义上 - 它不是磁盘上可以执行的文件,而是”内置“命令。内置命令由 shell 本身解释(例如:)。有关的内置命令bash列表,请参阅bashShell 内置命令“手册页的部分(或使用help内置的)。

如果cd它没有内置于 shell 中,那么就不可能每次都不分叉一个新进程就更改目录(这会非常混乱)。

这是因为当前工作目录(如环境)是进程的一个属性。这些东西可以从父进程继承到子进程,但不能“推送“从孩子那里得到支持再转给父母。

如果你确实想要一个 python 脚本改变当前工作目录然后显示一个 shell,你需要执行以下操作:

cd.py

#!/usr/bin/env python3

import os

os.chdir('/tmp/')
os.system('bash')

用法:

$ pwd
/home/attie/
$ echo $$
30665                  # the original shell's PID

$ ./cd.py

$ pwd
/tmp
$ echo $$
30464                  # the sub-shell's PID... it's parent is python

$ exit
exit

$ pwd
/home/attie/
$ echo $$
30665                  # the original shell's PID

答案2

不可以。对工作目录的更改只能影响当前进程(以及任何未来的子进程)。

答案3

如果您在 Python-Skript 中打印要执行的 cd 命令,则可以通过 bash 的 eval 来解决问题。但请记住,eval 非常不安全(例如,如果您的 Python-Skript 打印了类似 的内容rm -rf /*)。

cd.py() {
  eval "$( python ~/cd_.py $@ )"
}
# cd_.py:
import sys

target_dir = f"~/{sys.argv[1]}" # whatever you want to do with the arguments
print(f'cd "{target_dir}"') # Print 'cd path/to/file'

相关内容