使用 Python 脚本更改 Shell 中的工作目录

2024-11-11 08:27:00
admin
原创
21
摘要:问题描述:我想实现一个用户空间命令,它将接受其中一个参数(路径)并将目录更改为该目录。程序完成后,我希望 shell 位于该目录中。所以我想实现cd命令,但使用外部程序。可以在 python 脚本中完成吗?或者我必须编写 bash 包装器?例子:tdi@bayes:/home/$>python cd.p...

问题描述:

我想实现一个用户空间命令,它将接受其中一个参数(路径)并将目录更改为该目录。程序完成后,我希望 shell 位于该目录中。所以我想实现cd命令,但使用外部程序。

可以在 python 脚本中完成吗?或者我必须编写 bash 包装器?

例子:

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

解决方案 1:

其他人指出你不能从子级更改父级的工作目录。

但是有一种方法可以实现您的目标——如果您从 shell 函数 cd,它可以更改工作目录。将其添加到您的 ~/.bashrc 中:

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

您的脚本应该会打印出您想要更改到的目录的路径。例如,这可能是您的 cd.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/$> 前往 tdi
tdi@bayes:/home/tdi$> 前往 tdi

解决方案 2:

这是不可能的。

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

cd在子 shell 中执行的任何操作都不会影响父 shell。

解决方案 3:

正如 codaddict 所写,子 shell 中发生的事情不会影响父 shell。但是,如果您的目标是向用户展示不同目录中的 shell,您可以始终让 Pythonos.chdir更改子 shell 的工作目录,然后从 Python 启动shell。这不会更改原始 shell 的工作目录,但会为用户留下一个不同目录中的目录。

解决方案 4:

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

解决方案 5:

正如mrdiskodave
在“相当于 shell 'cd' 命令来更改工作目录?”中解释的那样,
有一种技巧可以在纯 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}
"
    for c in cmd:
        fcntl.ioctl(1, termios.TIOCSTI, c)

解决方案 6:

我将尝试以一种相当简单的方式展示如何将 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`
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用