linux 记录终端输入和输出的Bash脚本

p4rjhz4m  于 2023-08-03  发布在  Linux
关注(0)|答案(1)|浏览(145)

我正在学习bash,我认为有一个包含所有我在文件中所做的事情的日志会很好(比如script命令)。但是我不想使用script,我想创建自己的bash脚本。所以我写了这个:

rm file; tee -a file | bash 2>&1 | tee -a file

字符串
它工作得很好,但我想记录bash默认提示也。我在man bash中找到了-i选项,并更改了脚本(我必须在这里使用rmtee -a命令,而不是仅使用tee,因为它创建了一个奇怪的移位输出。所以我选择了简单的方法):

rm file; tee -a file | bash -i 2>&1 | tee -a file


但它不工作!它只执行并保存一个命令。有没有办法解决它(并了解它的原因)?
cat file在第一个脚本之后的输出示例:

echo 1      
1
echo 2
2


所需输出:

user@host:~$ echo 1      
1
user@host:~$ echo 2
2

toiithl6

toiithl61#

我选择了简单的方法:

rm file; tee -a file | bash -i 2>&1 | tee -a file

字符串
但它不工作!它只执行并保存一个命令。
您确实需要在交互模式下运行bash以获得提示,并且当其标准输出未连接到终端时,您需要显式地请求(通过-i)。
您遇到了麻烦,因为子bash的行为就像它在前台一样,因为它处于交互模式,但它实际上并没有连接到控制终端--两个tee命令是。当子bash执行命令时,它将该命令置于前台,但当命令终止时,子bash无法将至少一个tee返回到前台。
但无论如何那个命令不是你想要的。在交互模式下运行时,bash将其输入回显到其输出,这就是为什么您会看到您键入的内容。但这意味着您的命令捕获输入两次,一次是在它到达bash之前,另一次是在bash回显它之后。您不需要第一个tee,并且删除它还允许一些其他简化:

bash -i 2>&1 | tee file


事实证明,这对我来说完全像你想要的那样。它记录任意数量的命令,并带有提示和输出。

相关问题