gpt4 book ai didi

python -/bin/bash -i 覆盖 PS1

转载 作者:行者123 更新时间:2023-12-01 08:04:50 26 4
gpt4 key购买 nike

我使用以下 python3.6 代码 (g.py) 来启动带有自定义提示的交互式 bash shell:

import subprocess
import os


envi = os.environ.copy() # env of the python process
envi["PS1"]="my-prompt"

s = subprocess.Popen(['/bin/bash', '-i'], env=envi, shell=False)
s.communicate()

当我在 Debian Stretch 9 上运行它时,我得到:

initial_prompt> ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
206 pts/0 00:00:00 ps
initial_prompt> python3 g.py
user123§ced47a150f0c:ß$
user123§ced47a150f0c:ß$ ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
207 pts/0 00:00:00 python3
208 pts/0 00:00:00 bash
209 pts/0 00:00:00 ps

我得到的是 user123§ced47a150f0c:ß$ 而不是 my-prompt

  • 当我将 --norc 添加到 /bin/bash 时,它可以工作,但我需要读取 ~/.bashrc。<
  • ~/.bashrc中,PS1未更改。我没有 ~/.bash_profile 文件。
  • PROMPT_COMMAND 环境变量为空。
  • 在 MacOS 上,它就像一个魅力。

最佳答案

默认情况下,bash 没有交互式 shell 的系统范围配置文件。但是,在 config-top.h 中有一个编译时选项可以添加一个:

/* System-wide .bashrc file for interactive shells. */
/* #define SYS_BASHRC "/etc/bash.bashrc" */

如果启用此功能(我相信在 Debian 中是这样),则似乎无法在运行时禁用此功能而不同时禁用 ~/.bashrc

Debian 的 /etc/bash.bashrc 用它自己的值替换 PS1 的任何继承值。当然,您可以在自己的 ~/.bashrc 中覆盖它,但这意味着在启动交互式 shell 时,您无法通过环境强制使用 PS1 值。其他人。最后,用户可以选择他们的提示,而不是您的。

解决方法可能是提供您自己的 rcfile,该文件显式地获取用户的 ~/.bashrc 文件,然后将提示设置为您想要的内容。我不知道有什么简单的方法可以在没有临时文件的情况下执行此操作:

with NamedTemporaryFile(mode='w+', buffering=True, delete=False) as tmprc:
tmprc.write('. ~/.bashrc\n')
tmprc.write('PS1="my-prompt "\n')

s = subprocess.Popen(['/bin/bash', '-i', '--rcfile', tmprc.name])

关于python -/bin/bash -i 覆盖 PS1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55591009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com