Bash-如何将stderr重定向到管道中下一个命令的stdout?

时间:2018-08-02 18:10:04

标签: bash

上下文:我有一个备份脚本,该脚本将压缩指定的目录,然后将其通过管道传输到gpg,以对称地加密和压缩档案。然后,我将stderr重定向到stdout,并将它们都管道传输到tee以将其记录到文件中,并将输出保存到shell变量中。

RESULT=$(tar -c "$BACKUPPATH" |
         gpg --batch --passphrase 1234 --yes \
             -o "$FILELOC" -c --bzip2-compress-level 9 \
             2>&1 |
         tee -a "$LOG")

但是,tar一直失败,因此我想以相同的方式捕获tar的stderr(因此它显示在$RESULT以及日志文件中)。

最好的方法是什么?

我尝试过:

RESULT=$(tar -c "$BACKUPPATH" 3<&2 |
         gpg --cipher-algo AES256 --batch --passphrase 1234 --yes \
             -o "$FILELOC" -c --bzip2-compress-level 9 \
             2>&1 3>&1 |
         tee -a  "$LOG");

但是,当我通过虚假的路径到达tar时,它似乎不起作用。它不会显示在日志或变量中。也许我需要一个fifo?

1 个答案:

答案 0 :(得分:2)

RESULT=$(
    {
        tar -c "$BACKUPPATH" |
        gpg --batch --passphrase 1234 --yes \
            -o "$FILELOC" -c --bzip2-compress-level 9; \
    } 2>&1 | tee -a "$LOG"
)

通过将两个命令的stderr放在花括号中并将2>&1重定向应用于整个复合命令来重定向它们。