可能有一种更简单的方法可以做到这一点,我将在一个盒子上运行一堆命令。我想跟踪成功的命令,以便我可以用它来编写脚本,以便在将来自动执行此操作。
我试过
<command> && echo "!!" >> file
但!!
打印的是这一行之前的行。我尝试了其他一些方法,但都无法正常工作
答案1
你可以这样做:
PROMPT_COMMAND='[[ $? == 0 ]] && history 1 | sed -r "s/\ +[0-9]+\ +//" >> successful'
$PROMPT_COMMAND 保存 bash 在发出提示之前执行的命令。因此,它的作用是评估你的以前的命令 (后你按下回车键来执行当前命令,但是前bash 会对其进行评估),如果成功,则将其从 bash 历史记录中拉出,删除命令编号,然后将其添加到单独的文件中。
现在您不需要在命令中添加任何内容:
echo "exits successfully and will be appended"
ehco "only ends up in bash history"
请注意,readline 历史命令 !! 及其其余家族命令仅在交互式 shell 中起作用,不能在脚本中使用它们。
还要注意,-r 选项是 gnu sed,bsd sed 没有它。
答案2
我会使用第二个 shell 和 strace。在 shell 1 中,使用echo $$
查找 shell 的 PID。然后使用strace -f -q -eexecve,exit_group -p that_pid_here
跟踪命令和退出状态。随后可以将结果输出整理成 shell 脚本。
答案3
这样做就可以了 -注意是 ' 而不是 "
<command> && echo '!!' >> file