问题
我有一个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的历史。我没有看到任何错误,因此我假设它在其他外壳中运行。当我在脚本之外运行它时(直接在运行命令以调用脚本之后),它可以正常工作。
子流程并取消设置HISTFILE
我还使用了以下子过程,但没有成功:
subprocess.call("unset HISTFILE", shell=True)
操作系统和历史记录-c
我还将os库用于Python,并在脚本中包含以下内容:
os.system("history -c")
os.system并取消设置HISTFILE
我也尝试用os.system取消设置HISTFILE无效。
os.system("unset HISTFILE")
首选解决方案特征
我意识到我可以在使用命令后简单地输入未设置的HISTFILE或history -c。但是我希望这尽可能成为一个独立的脚本。
理想情况下,该解决方案可以防止./scomescript.py命令记录在.bash_history中。
我需要此脚本根据输入将文本输出到终端,因此我也无法在之后立即关闭终端。
我想象必须有一种方法可以从python脚本本身中执行此操作-这是我的偏爱。
解决方案
这确实是不太可行的...将条目添加到历史记录文件是由交互式Shell执行的,它是在命令完成且父Shell退出后发生的。它是,严格来说,可能的,如果你让你的Python程序执行产卵哈克后台进程,不喜欢的东西读循环重新写它的历史文件。我真的不能提倡这样的事情,但是您可以在脚本中添加以下内容:
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("")命令,而不是在命令行中传递敏感参数。
您也许还可以创建一个外壳函数来包装脚本,例如my_script(){ set +o history; python_script.py "$@; set -o history ;}?