将所有输出重定向到文件

Ray*_*yne 712 linux bash io-redirection

我知道在Linux中,要将屏幕输出重定向到文件,我可以使用>tee.但是,我不确定为什么部分输出仍然输出到屏幕而不写入文件.

有没有办法将所有输出重定向到文件?

Op *_*kel 1135

该部分写入stderr,用于2>重定向它.例如:

foo > stdout.txt 2> stderr.txt
Run Code Online (Sandbox Code Playgroud)

或者如果你想要在同一个文件中:

foo > allout.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

注意:这适用于(ba)sh,检查shell是否有正确的语法

  • 将`>`改为`>>`来追加而不是覆盖.有点明显但值得一提. (65认同)
  • 好吧,我找到了参考资料,并删除了我的帖子,因为他们的信息不正确.来自bash手册:'"ls 2>&1> dirlist"仅将标准输出指向dirlist,因为在标准输出重定向到dirlist之前,标准错误与标准输出重复":) (12认同)
  • 也来自bash man"有两种格式可以重定向标准输出和标准错误:&> word和>&word这两种形式,第一种是首选.这在语义上等同于> word 2>&1" (12认同)
  • @DustinGriffith那么,`foo >> allout.txt 2 >>&1`或`foo >> allout.txt 2>&1`? (6认同)
  • 两个重要的附录:如果你想*管道*stdout和stderr,你必须按照与文件相同的顺序编写重定向,`cmd1 2>&1 | cmd2`; 在`|`之后放置`2>&1`将重定向stderr为'cmd2`.如果重定向stdout和stderr,程序仍然可以通过打开`/ dev/tty`来访问终端(如果有的话); 这通常仅用于密码提示(例如,通过`ssh`).如果你也需要重定向,那么shell无法帮助你,但[`expect`](http://www.tcl.tk/man/expect5.31/expect.1.html)可以. (4认同)
  • @Geremia这很容易自己测试,但我会继续说'2>&1`. (3认同)
  • 有趣的是,当我设置为“top > stdout.txt 2> stderr.txt”时,它将在“stdout.txt”上输出,但如果像“foo > stdout.txt 2> stderr.txt”,它只会在“stdout.txt”上输出`stderr.txt` 不在 `stdout.txt` 上(空白文件) (2认同)
  • @DustinGriffith,是的,只使用`2>&1`确实有效; 我尝试过这个. (2认同)

Bry*_*gee 144

所有POSIX操作系统都有3个流:stdin,stdout和stderr.stdin是输入,可以接受stdout或stderr.stdout是主输出,其被重定向与>,>>,或|.stderr是错误输出,它是单独处理的,因此任何异常都不会传递给命令或写入可能会中断的文件; 通常,即使重定向stdout,也会将其发送到某种日志或直接转储.要将两者重定向到同一个地方,请使用:

command &> /some/file

编辑:感谢Zack指出上述解决方案不可移植 - 请改用:

*command* > file 2>&1 
Run Code Online (Sandbox Code Playgroud)

如果要使错误静音,请执行以下操作:

*command* 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

  • `&> file`(又名`>&file`)不是官方POSIX shell规范的一部分,但作为便利扩展添加到许多Bourne shell中(它最初来自`csh`).在便携式shell脚本中(如果您不需要可移植性,为什么要编写shell脚本?),请仅使用`> file 2>&1`. (22认同)
  • &>没有在sh中实现,所以要注意从cron文件执行的命令,crontabl使用sh来运行命令,除非你告诉它使用另一个shell. (3认同)

Sag*_*ain 84

例如,要在控制台和文件中获取输出file.txt.

make 2>&1 | tee file.txt
Run Code Online (Sandbox Code Playgroud)

注意:&(in 2>&1)指定1不是文件名而是文件描述符.

  • 顺便说一下, tee -a file.txt 意味着附加到一个文件。 (4认同)

Ind*_*our 44

用这个 - "require command here" > log_file_name 2>&1

Unix/Linux中重定向操作符的详细描述.

>运算符通常将输出重定向到文件,但它可以是设备.你也可以使用>>来追加.

如果未指定数字,则会假定标准输出流,但您也可以重定向错误

> file redirects stdout to file
1> file redirects stdout to file
2> file redirects stderr to file
&> file redirects stdout and stderr to file
Run Code Online (Sandbox Code Playgroud)

/ dev/null是一个空设备,它接受你想要的任何输入并抛弃它.它可以用来抑制任何输出.

  • 这将适用于unix和linux,而不管我们使用的shell. (2认同)

qrä*_*bnö 29

归功于osexp2003和ja ...


而不是放

&>> your_file.log
Run Code Online (Sandbox Code Playgroud)

在一条线后面

crontab -e
Run Code Online (Sandbox Code Playgroud)

我用

#!/bin/bash
exec &>> your_file.log
…
Run Code Online (Sandbox Code Playgroud)

在BASH脚本的开头.

优点:您的脚本中有日志定义.适合Git等


ose*_*003 16

您可以使用exec命令稍后重定向任何命令的所有stdout/stderr输出.

示例脚本:

exec 2> your_file2 > your_file1
your other commands.....
Run Code Online (Sandbox Code Playgroud)


Pet*_*nov 15

这可能是标准错误.你可以重定向它:

... > out.txt 2>&1
Run Code Online (Sandbox Code Playgroud)


ell*_*kie 15

命令:

foo >> output.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

附加output.txt文件,而不替换内容.


小智 6

使用>>附加:

command >> file

  • 这与原始问题有关,但没有回答. (6认同)