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

时间:2010-09-24 11:40:09

标签: python linux bash shell

我想实现一个userland命令,它将获取其一个参数(路径)并将目录更改为该目录。程序完成后,我希望shell在该目录中。所以我想实现cd命令,但需要使用外部程序。

可以在python脚本中完成,还是必须编写bash包装器?

示例:

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

5 个答案:

答案 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。

答案 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`