python - 从 Python 脚本中取消设置或删除最近的 .bash_history

标签 python linux macos bash shell

问题

我有一个 Python 脚本,当我从命令行运行它时,我不想在 .bash_history 中记录任何内容。

这是因为脚本使用了 Python argparse 库,它允许我直接从命令行将参数传递给 python 代码。

例如,我可以编写脚本,使其在脚本中使用“123456”作为值:

$ ./scriptname.py -n 123456

问题是我不想将值 123456 存储在 .bash_history 中。事实上,我宁愿一开始就不要将整个命令存储到 .bash_history 文件中。

我尝试过的

  1. 子进程和历史-c

我已将子进程库添加到我的脚本的顶部,然后在尝试主动清除我正在使用的 shell 的当前历史记录之后直接包含它:

subprocess.call("history -c", shell=True)

理论上这应该清除当前 shell 的历史记录。我没有从中看到错误,所以我假设它在其他一些 shell 中运行。当我在脚本之外运行它时(在运行调用脚本的命令之后直接运行)它可以正常工作。

  1. 子进程并取消设置 HISTFILE

我还使用了以下子流程但没有成功:

subprocess.call("unset HISTFILE", shell=True)
  1. os.system & history -c

我还使用了 Python 的 os 库,并在脚本中包含了以下内容:

os.system("history -c")
  1. os.system 并取消设置 HISTFILE

我也尝试过使用 os.system 取消设置 HISTFILE,但无济于事。

os.system("unset HISTFILE")

首选解决方案特征

我意识到我可以在使用命令后简单地输入 unset HISTFILE 或 history -c。但我希望它尽可能成为一个独立的脚本。

理想情况下,该解决方案将阻止 ./scomescript.py 命令被记录在 .bash_history 中。

我需要此脚本根据输入将文本输出到终端,因此我也无法在之后立即关闭终端。

我想一定有一种方法可以从 python 脚本本身执行此操作 - 这是我的偏好。

最佳答案

这确实不太可行...将条目添加到历史文件是由交互式 shell 执行的,它发生在命令完成且父 shell 退出之后。 ,严格来说,如果你要让你的 python 程序执行生成一个 hacky 后台进程,它会做一些事情,比如在循环中读取历史文件重写它。我真的不能提倡这样的事情,但你可以在你的脚本中附加类似这样的东西:

os.system("nohup bash -ic 'while :; do read -d \"\" history < \"$HISTFILE\"; echo \"$history\" | sed -e\"s@^%s.*@@\" -e\"/^$/d\" > \"$HISTFILE\"; sleep 1; done &' >/dev/null 2>&1" % sys.argv[0])

我认为实现不记录任何参数的目标的更好方法是使用类似var = raw_input("") 的方法而不是传递敏感参数在命令行上。

您也许还可以创建一个 shell 函数来包装您的脚本,例如 my_script(){ set +o history; python_script.py "$@; set -o history ;}?

关于python - 从 Python 脚本中取消设置或删除最近的 .bash_history,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36110170/

相关文章:

linux - 异常 : No Linux desktop project configured error on flutter project

linux - 使用 lsyncd 使用远程源更新本地文件夹?

linux awk 在多行上搜索和删除

macos - 使用 boot2docker 将 heroku postgres 数据库转储导入到 docker 数据库容器中

macos - 提高 tesseract OCR 的图像质量

Python Selenium - 如何终止未成功生成的 Chromedriver?

python - 从python中的字符串中删除连续的重复字符

python - 无法使用 python azure-storage-file-datalake SDK 在 Azure Data Lake Gen2 中创建追加 Blob

macos - Mac OS X sudo docker 无法连接到 Docker 守护程序。 docker 守护进程是否在此主机上运行?

python - 在 Python 中覆盖 equals 但仍然具有引用相等性检查