为什么从 Bash 历史记录中删除条目时会出现错误?

为什么从 Bash 历史记录中删除条目时会出现错误?

我想删除 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直接是最简单的方法。

相关内容