How to redirect and append both stdout and stderr to a file with Bash?

前端 未结 7 1175
春和景丽
春和景丽 2020-11-22 01:16

To redirect stdout to a truncated file in Bash, I know to use:

cmd > file.txt

To redirect stdout in Bash, appending to

7条回答
  •  心在旅途
    2020-11-22 01:28

    I am surprised that in almost ten years, no one has posted this approach yet:

    If using older versions of bash where &>> isn't available, you also can do:

    (cmd 2>&1) >> file.txt
    

    This spawns a subshell, so it's less efficient than the traditional approach of cmd >> file.txt 2>&1, and it consequently won't work for commands that need to modify the current shell (e.g. cd, pushd), but this approach feels more natural and understandable to me:

    1. Redirect stderr to stdout.
    2. Redirect the new stdout by appending to a file.

    Also, the parentheses remove any ambiguity of order, especially if you want to pipe stdout and stderr to another command instead.

    Edit: To avoid starting a subshell, you instead could use curly braces instead of parentheses to create a group command:

    { cmd 2>&1; } >> file.txt
    

    (Note that a semicolon (or newline) is required to terminate the group command.)

提交回复
热议问题