启动新终端时在 bash 中键入脚本

启动新终端时在 bash 中键入脚本

目前我需要捕获终端 (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

scriptfork一个子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 将出价向下滚动到“调用”:)

相关内容