从 bash 调用构建整个命令行

从 bash 调用构建整个命令行

我正在尝试重建整个 bash 命令行,例如包含管道;&& 或“;”。

我在 bash 上使用 DEBUG 陷阱来生成全局 command.log(类似于历史记录,但也适用于远程系统)。我有类似的东西:

preexec () { :; }
preexec_invoke_exec () {
    [ -n "$COMP_LINE" ] && return  # do nothing if completing
    [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
    local this_command=$(echo "${USER}@${HOSTNAME}:${PWD}> $BASH_COMMAND" | ${HOME}/cmd_digest.sh);
    preexec "$this_command"
}
trap 'preexec_invoke_exec' DEBUG

我发现这是通过bash 是否有一个在执行命令之前运行的钩子?

我以前的版本使用了更明显的:

PROMPT_COMMAND='echo "${USER}@${HOSTNAME}:${PWD}> $(HISTTIMEFORMAT= history 1|cut -c8-)" | ${HOME}/cmd_digest.sh'

这里的问题是 ssh 或 screen 等命令的记录时间非常长。DEBUG trap 可以修复此问题,确保 this_command 在命令本身之前执行。

但是,现在我必须处理 bash 调用。命令行如下:

echo foo | grep bar

陷入了两次困境,这当然是无法避免的。但是,如果我能收集有关 BASH_COMMAND 的信息,我可能能够重建发出的原始命令行。

那么可以使用什么环境变量来实现这一点?任何其他想法都非常欢迎。

相关内容