终端会话完全加载后如何运行 .bashrc 命令?

终端会话完全加载后如何运行 .bashrc 命令?

我想保存所有终端输出。如果我从某个终端会话运行“脚本”命令,它工作正常。但是如果我放入 .bashrc 文件,那么 .bashrc 文件会不断加载

Script started, output log file is 'typescript'.
Script started, output log file is 'typescript'.
Script started, output log file is 'typescript'.
Script started, output log file is 'typescript'.

我尝试了这个解决方案,其中通过设置局部变量第二次跳过命令。 https://unix.stackexchange.com/a/323920/381656

这也会产生问题。如果我从简单的终端运行这个命令,它工作得很好。但是如果我放入 .bashrc 那么它总是将当前目录更改为主目录。例如,如果我在终结者中使用分屏,那么它不会在该目录中打开,而是在主目录中打开。

有没有办法让 .bashrc 命令以类似于我从活动终端会话运行的方式运行。

更新

经过一番尝试和尝试,我发现了问题所在,为什么它不能在同一目录中打开。

假设我在 /abc/xyz 中打开终端。现在,当执行脚本时,就会启动新的 shell。如果我更改此 shell 的位置,它不会影响原始终端。原始终端仍然保留位置 /abc/xyz。如果我尝试分屏或打开新选项卡,则当前目录的参数将从父 shell 中获取,而不是从脚本的 shell 中获取。

父 shell 的环境变量“PWD”需要作为子 shell 进行更新以获得正确的结果。但正如另一个问题中提到的,这是不可能的。

是否可以在用户空间中将环境变量从子级传递到父级?

一种可能的黑客方法是使用文本文件来存储当前目录,并在打开新选项卡时更新到该位置。

答案1

script命令本身将 bash 作为子进程启动。该子进程将启动script(因为它在 中列出.bashrc),这将启动另一个bash进程,依此类推……这就是为什么您一次又一次看到相同的文本。您需要 a) 确保script仅调用一次 b) 并行script调用(即多个 bash 进程)不会覆盖彼此的输出。您可以将以下内容放在最后.bashrc

# Assumes bash-4.2, see https://stackoverflow.com/a/17538964/2923406
[[ -v IN_SCRIPT ]] || { export IN_SCRIPT=1 ; script "$HOME/typescript.$(date --rfc-3339=ns | tr ' ' '_')" ; exit $?; }

script仅当变量IN_SCRIPT不存在时才会调用。IN_SCRIPT被导出以确保子进程不会script再次启动。此外,所有script进程都将其输出写入名为“typescript”的文件。因此,当您并行运行多个终端时,您最终会得到多个文件。

相关内容