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


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

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

例:

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

11779
2017-09-24 11:40


起源



答案:


其他人指出,您无法从子级更改父级的工作目录。

但是有一种方法可以实现你的目标 - 如果你从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

15
2017-09-24 12:11



谢谢,我只想清楚这一点。 - Darek
我写了一个打印“cd {directory}”的脚本,我调用了它 `./change_dir` (即,运行脚本但用反引号包围它)这使得解释器执行程序打印到stdout的任何内容。 - Shadow


答案:


其他人指出,您无法从子级更改父级的工作目录。

但是有一种方法可以实现你的目标 - 如果你从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

15
2017-09-24 12:11



谢谢,我只想清楚这一点。 - Darek
我写了一个打印“cd {directory}”的脚本,我调用了它 `./change_dir` (即,运行脚本但用反引号包围它)这使得解释器执行程序打印到stdout的任何内容。 - Shadow


这是不可能的。

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

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


4
2017-09-24 11:44





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


1
2017-09-24 12:15





正如codaddict所写,你的子shell中发生的事情不会影响父shell。但是,如果您的目标是在不同目录中具有shell的用户,则可以始终使用Python os.chdir 更改子shell的工作目录,然后启动  来自Python的shell。这不会更改原始shell的工作目录,但会将用户留在不同的目录中。


0
2017-09-24 12:01





我将尝试展示如何以相当简单的方式将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`

-4
2018-06-16 16:48



我已经修复了你的格式,但是说真的,你真的不能非常努力,这是一个完全无法理解的混乱。 - Ajean
Ajean,谢谢。你是一个很好的运动。我希望这篇文章对一些人有所帮助。但不,我没有非常努力。我不喜欢那些比你更了解自己想要什么的编辑。我写了一篇相当好的缩进帖子,但编辑不断修改它,因为我没有敲击一些关键或其他。 - Robert Armstrong