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

xkrw2x1b  于 2023-02-07  发布在  Linux
关注(0)|答案(6)|浏览(315)

我想实现一个userland命令,它将使用它的一个参数(path)并将目录更改为该目录。程序完成后,我希望shell位于该目录中。因此,我想实现cd命令,但使用外部程序。
这可以在python脚本中完成吗?或者我必须编写bash Package 器?
示例:

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

new9mtju1#

其他人指出,您不能从子目录更改父目录的工作目录。
但是有一种方法可以实现你的目标--如果你从一个shell函数cd,它 * 可以 * 改变工作目录。

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

脚本应打印要更改到的目录的路径。例如,这可能是www.example.comcd.py:

#!/usr/bin/python
import sys, os.path
if sys.argv[1] == 'tdi': print(os.path.expanduser('~/long/tedious/path/to/tdi'))
elif sys.argv[1] == 'xyz':  print(os.path.expanduser('~/long/tedious/path/to/xyz'))

然后您可以:

tdi@bayes:/home/$> go tdi
tdi@bayes:/home/tdi$> go tdi
gwbalxhn

gwbalxhn2#

这是不可能的。
脚本在发出命令的父shell派生的子shell中运行。
在子shell中执行的任何cd操作都不会影响父shell。

epggiuax

epggiuax3#

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

dxxyhpgq

dxxyhpgq4#

正如codaddic所写的,在子shell中发生的事情不会影响父shell,但是,如果你的目标是在不同的目录中为用户提供一个shell,你可以让Python使用os.chdir来改变子shell的工作目录,然后从Python启动一个 new shell,这不会改变原始shell的工作目录。但是将给用户留下不同目录中的一个。

bwitn5fc

bwitn5fc5#

正如Equivalent of shell 'cd' command to change the working directory?中的mrdiskodave所解释的那样,在纯Python中有一个实现所需行为的技巧,我对mrdiskodave的答案做了一些修改,使其在Python 3中工作:

  • pipes.quote()函数已移至shlex.quote()
  • 要缓解执行期间用户输入的问题,可以使用退格符"\x08"删除以前的任何用户输入。

所以我的改编如下所示:

import fcntl
import shlex
import termios
from pathlib import Path

def change_directory(path: Path):
    quoted_path = shlex.quote(str(path))

    # Remove up to 32 characters entered by the user.
    backspace = "\x08" * 32

    cmd = f"{backspace}cd {quoted_path}\n"
    for c in cmd:
        fcntl.ioctl(1, termios.TIOCSTI, c)
bq3bfh9z

bq3bfh9z6#

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

相关问题