【问题标题】:Redirect all output to file in Bash [duplicate]将所有输出重定向到 Bash 中的文件 [重复]
【发布时间】:2011-10-04 04:44:36
【问题描述】:

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

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

【问题讨论】:

    标签: linux bash io-redirection


    【解决方案1】:

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

    $command &> /some/file

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

    $command > file 2>&1 
    

    如果您想消除错误,请执行以下操作:

    $command 2> /dev/null
    

    【讨论】:

    • 似乎 &> 和 2>&!都在做同样的事情?
    • &> file(又名>& file)不是官方 POSIX shell 规范的一部分,但已作为便利扩展添加到许多 Bourne shell(它最初来自 csh)。在可移植的 shell 脚本中(如果您不需要可移植性,为什么要编写 shell 脚本?),请仅使用 > file 2>&1
    • &> 未在 sh 中实现,因此请注意从 cron 文件执行的命令,crontabl 使用 sh 运行命令,除非您告诉它使用另一个 shell。
    【解决方案2】:

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

    ... > out.txt 2>&1
    

    【讨论】:

      【解决方案3】:

      感谢 osexp2003 和 j.a. …


      而不是放:

      &>> your_file.log
      

      在一行后面:

      crontab -e
      

      我用:

      #!/bin/bash
      exec &>> your_file.log
      …
      

      BASH 脚本的开头。

      优势:您的脚本中有日志定义。适用于 Git 等。

      【讨论】:

      • 正是我想要的,谢谢!就我而言,我没有直接执行脚本(一些我无法控制的包装脚本正在调用它),所以我无法在命令之后指定输入重定向
      • 我很高兴支持你。顺便说一句,我想指出我没有使用的示例(crontab)甚至不起作用,因为 crontab 使用的是 SH 而不是 BASH。为了进一步了解,其他答案可以提供帮助。如果您不知道,&>> /dev/null 仅适用于 BASH,并将 STANDARD_OUT (1) 和 STANDARD_ERROR (2) 重定向到 Nirvana(3 是 STANDARD_IN)。在这种特殊情况下,覆盖 (&>) 或追加 (&>>) 没有区别。
      【解决方案4】:

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

      make 2>&1 | tee file.txt
      

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

      【讨论】:

      • 顺便提一下, tee -a file.txt 表示追加到文件中。
      【解决方案5】:

      命令:

      foo >> output.txt 2>&1
      

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

      【讨论】:

      • 它在 crontab 中为我工作,用于 R、Ubuntu 14 中的脚本。
      【解决方案6】:

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

      示例脚本:

      exec 2> your_file2 > your_file1
      your other commands.....
      

      【讨论】:

        【解决方案7】:

        使用>> 追加:

        command >> file

        【讨论】:

        • 这个和原问题有关,但不回答。
        • 不回答,但通常被误解,第一个答案实际上暗示 > 和 >> 和 |是可以互换的。即 - 这不值得你投反对票。
        【解决方案8】:

        使用这个 - "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
        

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

        【讨论】:

        • Unix/Linux 中的重定向操作符?哪个壳?
        • 这将在 unix 和 linux 中工作,并且与我们使用的 shell 无关。
        • 显然&>是一些shell支持的扩展,但POSIX没有指定。如果dash 是您的/bin/sh,请准备好它闯入#!/bin/sh 脚本。在破折号中,它与两个单独的命令解析相同:foo &,即在后台运行命令,输出连接到 shell 的标准输出(例如终端),然后分别>output 截断输出文件。其他的是标准语法,它们都在 Bash 和 Zsh 以及现代 GNU/Linux 发行版默认提供的其他典型交互式 shell 中工作。
        【解决方案9】:

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

        foo > stdout.txt 2> stderr.txt
        

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

        foo > allout.txt 2>&1
        

        注意:这在 (ba)sh 中有效,请检查您的 shell 的语法是否正确

        【讨论】:

        • 好吧,我找到了参考资料,并因信息不正确而删除了我的帖子。来自 bash 手册:'"ls 2>&1 > dirlist" 仅将标准输出定向到 dirlist,因为在将标准输出重定向到 dirlist 之前,标准错误已从标准输出中复制了":)
        • 同样出自bash man "重定向标准输出和标准错误有两种格式:&>word和>&word这两种形式,首选第一种。这在语义上相当于>word 2 >&1"
        • 两个重要的补充:如果你想管道 stdout 和 stderr,你必须以与文件工作相反的顺序编写重定向,cmd1 2>&1 | cmd2;将2>&1 放在| 之后会将stderr 重定向到cmd2。如果 stdout 和 stderr 都被重定向,程序仍然可以通过打开 /dev/tty 访问终端(如果有);这通常仅用于密码提示(例如,ssh)。如果您也需要重定向,shell 无法帮助您,但 expect 可以。
        • > 更改为 >> 以追加而不是覆盖。有点明显,但值得一提。
        • @DustinGriffith 所以,foo >> allout.txt 2>>&1foo >> allout.txt 2>&1?
        猜你喜欢
        • 2021-11-04
        • 2018-11-07
        • 2013-05-26
        • 2020-03-22
        • 1970-01-01
        • 2015-03-24
        • 2020-08-03
        • 2019-10-11
        相关资源
        最近更新 更多