![从 bash 调用构建整个命令行](https://linux22.com/image/1577484/%E4%BB%8E%20bash%20%E8%B0%83%E7%94%A8%E6%9E%84%E5%BB%BA%E6%95%B4%E4%B8%AA%E5%91%BD%E4%BB%A4%E8%A1%8C.png)
我正在尝试重建整个 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 的信息,我可能能够重建发出的原始命令行。
那么可以使用什么环境变量来实现这一点?任何其他想法都非常欢迎。