如何将输出重定向到屏幕以及文件?


12

我的目的是将脚本的所有输出记录到该脚本将要创建的目录中。

例如,我有:

~/.abc.sh

#! /bin/bash
rails new myapp

我跑步的时候

cd ~/code
. ~/.abc.sh

...将在目录中创建一个新的Rails应用程序~/code/myapp

Rails创建应用程序时,它会输出大量我要捕获的文本,并将其存储在与rails新创建的命令相同的目录中的日志文件中。我也想在终端中显示该文本。

我该怎么做呢?

Answers:


23

您可以使用以下tee命令:

command | tee /path/to/logfile

不写外壳的等价物将是:

command > /path/to/logfile

如果要追加(>>)并在shell中显示输出,请使用以下-a选项:

command | tee -a /path/to/logfile

请注意,管道只会捕获stdout,使用不会处理stderr错误tee。如果要记录错误(来自stderr),请使用:

command 2>&1 | tee /path/to/logfile

这意味着:运行commandstderr流(2)并将其重定向到stdout(1)。它将与tee应用程序一起传递到管道。


你是说~/.abc.sh | tee <file>吗 如果是这样,那么麻烦是我在调用应用程序时不知道脚本将在哪个目录中创建应用程序,那么我将如何知道在file参数中提供什么呢?(感谢出色的示例)
Zabba 2011年

@Zabba:如何创建一个临时文件然后将其移动?
Lekensteyn 2011年

好的,那应该工作:)。关于这一点,我如何创建一个具有随机名称的临时文件,然后将其输出到该文件,然后再复制到所需的位置?是否有一些内置命令来获取“临时文件名”?
2011年

@Zabba:命令是mktemp。请参见手册页man mktemp
Lekensteyn 2011年

跪拜,像魅力一样工作
Sun

0

script将启动一个交互式会话并将所有输出(stdout / stderr等)记录到文件中,或者(使用-c参数)将运行命令并记录该输出。

script -c ~/.abc.sh -f abc.log

注意:在交互式会话中,您可以像平常一样退出会话即可停止录制(例如exitCtrl-D)。

对于带有视频回放的会话录制,您也可以尝试asciinema

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.