对Bash重定向进行细粒度控制

时间:2012-02-11 09:46:13

标签: bash redirect

考虑以下Bash命令行:

time ls         # Sends directory contents to stdout
time ls --foo   # Sends an error message to stderr (--foo is an invalid option)

time的输出(正常输出和错误输出)重定向到一个文件,将ls的输出重定向到另一个文件:

time ( ls       &>ls.txt ) &>time.txt
time ( ls --foo &>ls.txt ) &>time.txt

time的错误输出重定向到time.txt并将ls的输出发送到终端:

time ( ls       &>/dev/stdout ) 2>time.txt
time ( ls --foo &>/dev/stdout ) 2>time.txt

以上两行将ls的正常输出和错误输出合并到stdout(fd 1)中。我想执行以下操作:ls的输出发送到终端(正常输出到stdout,错误输出到stderr),以及time到{{1}的错误输出} 即可。从概念上讲:

time.txt

不幸的是,最后一行无法正常工作,因为time ( ls 1>/dev/stdout 2>/dev/stderr ) 2>time.txt time ( ls --foo 1>/dev/stdout 2>/dev/stderr ) 2>time.txt 的错误输出已写入ls

如何将time.txt的正常输出发送到stdout,将ls的错误输出发送到stderr,将ls的错误输出发送到time

2 个答案:

答案 0 :(得分:1)

这可能对您有用:

{ time ls --foo 2>&3; } 3>/dev/stderr 2>time.txt

答案 1 :(得分:0)

您可以这样做:

time (ls --foo 2>&3) 3>/dev/stderr 2>time.txt

(重定向的顺序很重要。)