我正在学习bash,我认为在一个文件中有一个包含我所做的所有操作的日志(log)会很好(就像script命令所做的那样).但我希望创建自己的bash脚本,而不是使用script.所以我写了这样的话:

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

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

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

推荐答案

我 Select 了简单的方式):

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

但这不管用!它只执行和保存一个命令.

您确实需要在交互模式下运行bash才能获得提示,并且当其标准输出未连接到终端时,您需要明确要求(通过-i).

你遇到了麻烦,因为子元素bash的行为就像是在前台,因为它处于交互模式,但它实际上并没有连接到控制终端--这两个tee命令是连接的.当子程序bash执行命令时,它将该命令放入前台,但当该命令终止时,子程序bash无法将tee中的至少一个返回到前台.

但无论如何,这个命令并不是你想要的.在交互模式下运行时,bash会将其输入 echo 到其输出,这就是为什么您会看到您键入的内容.但这意味着您的命令将捕获两次输入,一次是在达到bash之前,另一次是在达到bash之后.您不需要第一个tee,删除它还可以进行其他一些简化:

bash -i 2>&1 | tee file

事实证明,正如你所希望的那样,这对我完全有效.它记录任意数量的命令,并带有提示和输出.

Linux相关问答推荐

C++17:G++8.5版似乎无法正确生成无符号64位伪随机整数

为什么在Linux上STD::SLEEP_FOR(STD::Chrono::Hors::Max())会立即返回?

如何在带模式的文件频繁更改的管道中使用grep-f带模式的文件?

Boost更新失败,现在不确定我有哪个版本

SessionNotCreatedException:无法启动新会话.响应代码 500 在远程服务器上的 Apache Tomcat/10.0.23 上使用 ChromeDriver

CMake:处理静态库和共享库的正确方法

如何使用 shell 脚本查找具有最大上下文长度的行号?

是否可以在 XTerm 或 Konsole 中使 stdout 和 stderr 输出具有不同的 colored颜色 ?

每次来宾重新启动后 Vagrant 执行脚本或命令(vagrant up)

如何使目录下的所有文件在linux上可读?

用于 Linux 的 Less 编译器

SVN 错误:无法将字符串从本机编码转换为UTF-8

bashrc 在运行 bash 命令之前不会加载

为什么`du`的输出通常与`du -b`如此不同

以原子方式移动目录

如何找到只对所有者具有特定权限的文件?

ldconfig 错误:使用 Linux 加载程序时不是符号链接

如何在 UNIX 中将字符串转换为整数

如何在 Linux 中将 .so 文件添加到 java.library.path

Linux 上的 NuGet:获取响应流时出错