将HISTFILE设置为命名的pip

2024-06-16 10:53:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我尝试了以下方法:

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"

我用一个类似的“hello world”运行它,它被写入管道,并且它确实显示了它(因此我知道管道存在,并且可以接收数据)。你知道吗

当我将bashrc设置为上面的值并重新启动我的终端时,我不会得到命令提示,直到我两次点击control C(假设它试图写入指定的管道,但是我没有正在运行的脚本,所以我不能“读取它”,所以我必须终止它)。我继续说,它将保留历史,但那是因为它在内存中,没有被推到文件。你知道吗

我发现这可能有一些有用的信息,但我只是不知道如何使它为我所要做的工作。 https://askubuntu.com/questions/67283/is-it-possible-to-make-writing-to-bash-history-immediate 当我尝试结合命名管道输入其中的一些内容时,我从未得到命令提示。我终于合上shell,把那些行注释掉了。你知道吗

我的最终目标是,我希望能够在发出每个命令时接收它们,并将它们推送到联机数据库或其他什么地方,这样我就可以拥有一些类似于网页浏览历史的东西,但是对于命令。它会告诉我在每个设备上使用了什么命令、日期和时间。你知道吗

我最初的想法是,我可能可以通过一个命名的管道来实现这一点,但我不知道这样做是否可行或合乎逻辑。你知道吗

我希望我可以设置命名的管道,然后启动python或其他东西来读取写入的管道,并将数据推到网上,比如firebase或其他什么。你知道吗

我想我有几个问题。你知道吗

  1. 命名管道对整个事情来说是个好主意吗?(如果没有,你还有其他想法吗?)你知道吗
  2. 有没有其他方法可以不断地远程推送数据?你知道吗

*背景:几个月前,我在我的主pc上安装了wifi usb加密狗的驱动程序,但那台pc现在无法启动(我想是电源问题),我在我的上网本上升级了ubuntu(我运行的是旧版本,不再更新了),正常的wifi无法工作,所以我插上了usb wifi,它工作正常(但很脆弱),我知道要解决这些问题,我必须执行一些其他步骤,但事实上,现在我需要谷歌的东西(我不记得我得到的建议是直接的或不是现在,或者如果我不得不摆弄)。这让我产生了这样一个想法:能够通过设备在一段时间内搜索历史将是一件很好的事情。我考虑过下载BASH源代码并在其中注入一些东西,然后重新编译并使用它,但是我必须为每个设备都这样做,在安装开始时将一些东西扔进PC并完成它会更方便。你知道吗

*根据问题/评论更新 虽然通过PID拆分成不同的hist文件是描述命令历史的一个好方法,但我不确定每次更新时如何将每个命令推送到远程数据库,我几乎必须打开PID命名的文件,抓取内容并推送到远程数据库,然后删除内容,同时希望不会阻塞shopt?从运行到存储发生的下一个命令的命令(假设一次有一堆命令)。你对这是否是个问题有什么建议吗?你知道吗


Tags: 文件方法命令内容if管道line历史
1条回答
网友
1楼 · 发布于 2024-06-16 10:53:17

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

1)bash在启动时读取历史记录,但这当然只能在历史记录是普通文件的情况下才起作用(除非您的程序非常聪明,并且将字符作为伪历史记录注入—但请参阅下一点)。这可能就是你的壳挂起来的原因。你知道吗

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

3)bash处理历史的方式取决于它的版本/内部版本。如果一个用于处理某个版本的解决方案停止处理另一个版本,我不会感到惊讶。你知道吗

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

相关问题 更多 >