我想实现一个userland命令,它将获取其一个参数(路径)并将目录更改为该目录。程序完成后,我希望shell在该目录中。所以我想实现cd
命令,但需要使用外部程序。
可以在python脚本中完成,还是必须编写bash包装器?
示例:
tdi@bayes:/home/$>python cd.py tdi
tdi@bayes:/home/tdi$>
答案 0 :(得分:15)
其他人指出,你不能从孩子那里改变父母的工作目录。
但是有一种方法可以实现你的目标 - 如果你从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/$> go tdi tdi@bayes:/home/tdi$> go tdi
答案 1 :(得分:4)
这是不可能的。
您的脚本在发出命令的父shell生成的子shell中运行。
子shell中完成的任何cd
都不会影响父shell。
答案 2 :(得分:1)
cd
被独占(?)实现为shell内部命令,因为任何外部程序都无法更改父shell的CWD。 p>
答案 3 :(得分:0)
正如codaddict所写,你的子shell中发生的事情不会影响父shell。但是,如果您的目标是在不同目录中具有shell的用户,则可以始终让Python使用os.chdir
来更改子shell的工作目录,然后从中启动 new shell蟒蛇。这不会更改原始shell的工作目录,但会使用户在另一个目录中保留一个。
答案 4 :(得分:-4)
我将尝试展示如何将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`