我想删除 Bash 历史记录中的一些命令。
我可以找到它们history | grep "command with password"
然后删除它们history -d <line-number>
但是,当我尝试通过管道将它们批量删除时,xargs
我收到错误:
history | grep "command with password" | awk '{print $1}' | sort -r | xargs history -d
xargs: history: No such file or directory
我认为这xargs
会遍历行号列表并将其一一发送到history -d
命令。
是什么导致了这个错误?
注意:我知道还有其他方法可以删除历史记录,问题纯粹是为了提高我对xargs
工作原理以及我做错了什么导致错误的理解。
答案1
引发错误是因为 xargs 找不到history
命令。它是一个内置的 shell,您可以使用 确认type history
,因此对 xargs 不可见。尝试
echo 1 | xargs history -d; echo $?
返回值为127。man xargs
, 退出状态部分:
0 if it succeeds
123 if any invocation of the command exited with status 1-125
124 if the command exited with status 255
125 if the command is killed by a signal
126 if the command cannot be run
127 if the command is not found
1 if some other error occurred.
扩展伊尔卡丘的评论,原则上您可以调用 Bash 并history
从生成的 shell 中调用。
echo 1 | xargs -I {} bash -c 'echo $HISTFILE; history' bash {}
history
在 Bash shell 可以使用所有内置命令之后,上述命令不会引发错误。然而,从同一命令中,我们还发现HISTFILE
未设置并且history
不输出任何内容:在非交互式 shell 上未启用历史记录。同样,您可以使用set
内置、导出HISTFILE
和激活它HISTFILESIZE
,但我们不想头痛。编辑.bash_history
直接是最简单的方法。