【问题标题】:Unix Subshell inheriting the command history from parent bashUnix Subshel​​l 从父 bash 继承命令历史记录
【发布时间】:2013-06-06 11:19:41
【问题描述】:

我编写了一系列生成新 bash 会话的 python 工具。我希望这些单独的子外壳继承父级的命令历史记录。我试过了:

shopt -s histappend
PROMPT_COMMAND="history -an;$PROMPT_COMMAND"

.bash_profile。但它没有给我我需要的东西。我已经看到这样做了。我的工具使用:

os.system('bash')

产生一个子进程。

想法?更好的方法?

【问题讨论】:

    标签: python bash unix history subshell


    【解决方案1】:

    Depending on your OS.bash_profile 只能由登录 shell 执行,而.bashrc 对非登录 shell 执行。

    所以试着放

    shopt -s histappend
    PROMPT_COMMAND="history -a; history -n"
    

    .bashrc 而不是.bash_profile

    【讨论】:

    • 当我使用 history -an 时会出错。状态我一次只能使用一个 -anrw 选项。我用历史 -a;历史-n;反而。仍然没有得到我所期望的。目标是让每个衍生/分叉的子 shell 继承其父历史,而不是所有 shell。
    • 您能否提供一个示例,说明父代的历史在生成的子shell 之间是如何变化的?我无法重现该问题。
    • 我把它移到了 .bashrc,它仍然没有将命令记录到 .bash_history 文件中,直到我终止 shell 或退出子进程。为了测试,我清除了 .bash_history 文件。因为历史现在基本上是空的......在产生的子进程中没有历史可以回忆,甚至没有父shell历史,因为它没有写入.bash_history
    • 如何将PROMPT_COMMAND="history -a; history -n" 放入~/.bashrc,然后打开一个新终端。 echo $PROMPT_COMMAND 显示什么?如果您运行watch tail ~/.bashrc,然后打开另一个终端,并键入一些命令,这些命令是否出现在watch tail 终端中?
    • $PROMPT_COMMAND 正确回显。 watch 不是 bash 识别的命令?!
    【解决方案2】:

    site.py 在启动时设置 os.environ。除非您明确更改 os.environ,否则这不会更改。所以,对 os.system('/bin/bash') 的调用应该有一个和你在 python 启动时一样的环境。

    在启动后立即检查 os.environ,如有必要,对 os.environ 进行更改。直接。

    python docs os

    【讨论】:

    • 我正在使用 os.environ 命令为子子 shell 设置环境变量。这很好用。这可以用来传播命令历史记录吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 2019-10-22
    相关资源
    最近更新 更多