问题
我有一个 Python 脚本,当我从命令行运行它时,我不想在 .bash_history 中记录任何内容。
这是因为脚本使用了 Python argparse 库,它允许我直接从命令行将参数传递给 python 代码。
例如,我可以编写脚本,使其在脚本中使用“123456”作为值:
$ ./scriptname.py -n 123456
问题是我不想将值 123456 存储在 .bash_history 中。事实上,我宁愿一开始就不要将整个命令存储到 .bash_history 文件中。
我尝试过的
- 子进程和历史-c
我已将子进程库添加到我的脚本的顶部,然后在尝试主动清除我正在使用的 shell 的当前历史记录之后直接包含它:
subprocess.call("history -c", shell=True)
理论上这应该清除当前 shell 的历史记录。我没有从中看到错误,所以我假设它在其他一些 shell 中运行。当我在脚本之外运行它时(在运行调用脚本的命令之后直接运行)它可以正常工作。
- 子进程并取消设置 HISTFILE
我还使用了以下子流程但没有成功:
subprocess.call("unset HISTFILE", shell=True)
- os.system & history -c
我还使用了 Python 的 os 库,并在脚本中包含了以下内容:
os.system("history -c")
- 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/