Python 将HISTFILE设置为命名管道

Python 将HISTFILE设置为命名管道,python,linux,bash,Python,Linux,Bash,我一直在寻找如何做到这一点,它似乎被提到了几次作为一个建议,我还没有找到一个例子 我尝试了以下方法: mkfifo /tmp/testpipe mknod /tmp/testpipe p 最后,我更新了我的~/.bashrc文件以包含以下内容: HISTFILE=/tmp/testpipe 我在网上找到了一个脚本,该脚本应如下所示: #!/bin/bash pipe=/tmp/testpipe trap "rm -f $pipe" EXIT if [[ ! -p $pipe ]]; th

我一直在寻找如何做到这一点,它似乎被提到了几次作为一个建议,我还没有找到一个例子

我尝试了以下方法:

mkfifo /tmp/testpipe
mknod /tmp/testpipe p
最后,我更新了我的~/.bashrc文件以包含以下内容: HISTFILE=/tmp/testpipe

我在网上找到了一个脚本,该脚本应如下所示:

#!/bin/bash

pipe=/tmp/testpipe

trap "rm -f $pipe" EXIT

if [[ ! -p $pipe ]]; then
    mkfifo $pipe
fi

while true
do
    if read line <$pipe; then
        if [[ "$line" == 'quit' ]]; then
            break
        fi
        echo $line
    fi
done

echo "Reader exiting"
#/bin/bash
管道=/tmp/testpipe
陷阱“rm-f$管道”出口
如果[!-p$pipe]];然后
mkfifo$管道
fi
虽然是真的
做

如果读一行恐怕没有简单的方法可以像你想的那样截取历史。我刚刚查看了bash源代码,有许多问题使得用管道替换普通历史文件几乎不可能:

1) bash在启动时读取历史记录,但当然,只有当历史记录是一个普通文件时,这才有效(除非您的程序真的很聪明,并且将字符作为假历史记录注入,但请参见下一点)。这可能就是你的壳挂起来的原因

2) bash限制了文件大小,因此它必须使用仅适用于普通文件的服务(例如“truncate”、“lseek”…)

3) bash处理历史的方式取决于其版本/构建。如果用于某个版本的解决方案在另一个版本上停止工作,我不会感到惊讶


也许更好的解决方案是监视文件系统事件,以便检测历史文件的更改。不像听管道那么简单,但如果您感兴趣,可以查看。

您可以将
HISTFILE
设置为一个表达式,其中包含每个shell的唯一内容,例如pid,然后使用askubuntu页面中的解决方案。此时,每个shell都有一个单独的histfile,您可以使用外部进程查询它。当然,这也可能会破坏在新shell上加载histfile的过程;也许pid以外的一些方案是合适的。监视历史文件更新的一个障碍是,它不会在每个命令后推送历史,只有当它最终推送到历史文件时,我相信我读到它只会在您关闭会话时推送。此外,我无法按会话对其进行细分(如果我在每个窗口中执行不同的操作,这确实是一个理想的会话)。我必须不断思考解决这个问题的方法。