使用python脚本更改shell中的工作目录

我想实现一个userland命令,它将接受其中一个参数(path)并将目录更改为该目录。 程序完成后,我希望shell在该目录中。 所以我想实现cd命令,但是用外部程序。

它可以在Python脚本中完成,或者我必须写bash包装?

例:

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

其他人指出,你不能从一个孩子改变父母的工作目录。

但是有一种方法可以实现你的目标 – 如果你从shell函数中cd,它可以改变工作目录。 把这个添加到你的〜/ .bashrc中:

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

您的脚本应该打印到您要更改的目录的路径。 例如,这可能是你的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' 

那你可以这样做:

 tdi @ bayes:/ home / $>去tdi
 tdi @ bayes:/ home / tdi $>去tdi

这是不可能的。

您的脚本运行在发出命令的父shell所生成的子shell中。

任何在子shell中完成的cd都不会影响父shell。

cd完全是(?)作为shell内部命令实现的,因为任何外部程序都不能改变父shell的CWD。

由于codaddict写道,你的子shell中会发生什么不会影响父shell。 但是,如果你的目标是在一个不同的目录下有一个shell的用户,你总是可以让Python使用os.chdir来改变子shell的工作目录,然后从Python启动一个新的 shell。 这不会更改原始shell的工作目录,但会将用户保留在不同的目录中。

我将尝试展示如何以相当简单的方式将Bash终端的工作目录设置为Python程序所需的任何路径。

只有Bash可以设置其工作目录,因此Python和Bash需要使用例程。 Python程序有一个例程定义为:

 fob=open(somefile,"w") fob.write(dd) fob.close() 

“Somefile”可能是一个RAM磁盘文件。 Bash“mount”会显示tmpfs挂载在“/ run / user / 1000”之类的地方,所以somefile可能是“/ run / user / 1000 / pythonwkdir”。 “dd”是所需的完整目录路径名称。

Bash文件看起来像这样:

 #!/bin/bash #pysync ---Command ". pysync" will set bash dir to what Python recorded cd `cat /run/user/1000/pythonwkdr`