目前我需要捕获终端 (bash) 的所有输出以供日后查看。目前我在 .bashrc 文件的最后一行编写了以下脚本:
. /home/[USER]/.bash_profile
在此我提供我的 .bash_profile 命令;如果我省略此命令,我的 .bash_profile 将根本不会被执行。
我的.bash_profile脚本包含以下内容:
export HISTSIZE=999999999
export SYNCPATH="/tmp"
export HISTFILE=$SYNCPATH/bash_history_$(date +%d-%m-%Y)
shopt -s histappend # append to history, don't overwrite it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
script -m advanced -a -f -T $SYNCPATH/timeinformation_$(date +%d-%m-%Y) $SYNCPATH/typescript_$(date +%d-%m-%Y)
不管怎样,它都能正常工作,但是它会重新执行脚本命令(看起来好像卡在了某种循环中)。查看屏幕截图,它不断产生新的脚本进程。
我可以通过命令CTRL+退出此过程D,但输出将不会被保存。
有人能提供一些建议吗?
答案1
script
fork一个子shell,所以一般来说,这样的脚本是有可能被获取的。
但是子 shell 不是登录 shell,因此~/.bash_profile
不应被获取,而只能被~/.bashrc
替代。
我在我的 Raspbian Bullseye 系统上验证了这一点,它似乎按照你想要的方式工作:
- 首次登录时
~/.bash_profile
获取 - 调用
script
- 分叉一个新的非登录
bash
~/.bashrc
仅调用- 因此没有
script
创建嵌套实例。
我现在不确定为什么在你的情况下似乎恰恰相反,以便在初始登录时你需要~/.bash_profile
手动获取资源(或者你打开终端仿真器或其他类型的非登录 shell?),而子 shell~/.bash_profile
则自动获取资源。
但你可以script
轻松地阻止嵌套执行:
pgrep script &> /dev/null && return
- 在源脚本内和函数外部,
return
停止进一步的源,因此它类似于exit
在执行的脚本内调用。
script
但是,追踪系统上哪种脚本源自哪种情况是有意义的,并通过将调用放入正确的脚本中来首先防止这种意外情况。
有关在 bash 调用(登录、交互、非交互)时哪些文件以何种顺序、按照何种类型获取,以及如何在 shell 中强制和派生某种类型的更多信息,请阅读 man:https://linux.die.net/man/1/bash 将出价向下滚动到“调用”:)