我想实现一个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`