Linux 如何为每个命令重定向文件中的STDOUT和STDERR?

Linux 如何为每个命令重定向文件中的STDOUT和STDERR?,linux,bash,ubuntu,terminal,command-line-interface,Linux,Bash,Ubuntu,Terminal,Command Line Interface,我正在尝试将终端的STDOUT和STDERR(如果可能的话,还包括用户提供的STDIN)存储在每个命令的文件中 因此,我开始创建一个陷阱函数,以编辑的方式执行每个命令,如: shopt-s extdebug preexec\u invoke\u exec(){ [-n“$COMP_LINE”]&返回#如果完成,则不执行任何操作 [“$BASH_COMMAND”=“$PROMPT_COMMAND”]&&return#不要导致$PROMPT_命令的preexec eval`history 1|sed

我正在尝试将终端的STDOUT和STDERR(如果可能的话,还包括用户提供的STDIN)存储在每个命令的文件中

因此,我开始创建一个陷阱函数,以编辑的方式执行每个命令,如:

shopt-s extdebug
preexec\u invoke\u exec(){
[-n“$COMP_LINE”]&返回#如果完成,则不执行任何操作
[“$BASH_COMMAND”=“$PROMPT_COMMAND”]&&return#不要导致$PROMPT_命令的preexec
eval`history 1|sed-e“s/^[]*[0-9]*[]*/“`|&tee~/最近的_output.txt
返回1#这将阻止执行原始命令
}
陷阱“preexec\u invoke\u exec”调试
保存上述文件并执行

source file.sh
这完成了我想要的工作,但阻止了一些命令的执行

cd ..
原因是管道创建一个子外壳,然后执行其中的每个命令。因此,主外壳不受影响

甚至bash的脚本功能,即

script ~/recent_output.txt
已工作,但仅在您在终端中执行
退出后提供输出


因此,基本上我想存储/获取在bash终端中执行的前一个命令的输出。您可以帮助我学习任何语言(golang、python…。

可以使用以下方法捕获bash脚本(例如x.sh)的命令、stderr和stdout:


err.txt将捕获已执行的命令(前缀为“+”),以及每个命令的stderr。out.txt将捕获输出

“eval`history 1 | sed-e”s/^[]*[0-9]*[]*/“`”why eval?这是因为
history 1 | sed-e“s/^[]*[0-9]*[]*/“
输出一个字符串,eval可以执行,为什么不直接使用它呢?我担心
eval
在处理角落案例、引号、多行命令等方面会非常糟糕。从终端执行herodoc将导致
eval
的失败。为什么不干脆
eval“$BASH\u命令”
?但是这些命令的问题是,它们创建了一个新的子shell并执行它们,但是我想在同一个shell中执行,所以可能会重定向stdout和stderr?类似于
exec 1>>(tee stdout.txt)
exec 2>>(tee stderr.txt)
。像
exec 3>&2>>(tee stderr>&3)
命令将以$PS4作为前缀,默认值为“+”
bash -x x.sh 2> >(tee err.txt) | tee out.txt