bashredirectstdout和stderr来通过ssh分离命令

我正在使用BASH 4.我试图find一种方法来合法地预输出,以指示它的输出types。 我可以用这样的东西做这个…

ls -l /tmp/abcdefgh 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /') stderr: ls: cannot access /tmp/abcdefgh: No such file or directory ls -l /tmp/ 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /') stdout: drwxr-xr-x 3 root root 4096 2010-10-15 09:08 fsck stdout: drwxr-xr-x 2 root root 4096 2010-09-10 06:01 kernel stdout: drwxr-xr-x 2 root root 4096 2010-09-10 06:01 temp_keys ... 

当我通过SSHlogin并以交互方式运行时,这看起来有效。 但是,如果我试图通过引号中的命令通过ssh运行命令作为远程命令,这并不总是正确的。 我总是可以得到stdout线,但有时候不会有stderr线。

这将产生输出…

 ssh root@server1 "ls -l /tmp/ 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')" 

这不会产生一个错误信息…

 ssh root@server1 "ls -l /tmp/abcdefgh 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')" 

但是,这显示wget状态结果为stderr结果(它应该)

 ssh root@server1 "wget http://server2/package.rpm 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')" 

我在我的电脑上尝试了以下内容,完全没有涉及到ssh:

 $ ls asdfasdf 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /') $ stderr: ls: cannot access asdfasdf: No such file or directory 

第二行中的$不是拼写错误。 那些sed命令完全在后台运行。 ls给出了它的错误信息,并完成了足够的时间让shell在sed有机会输出任何东西之前输出提示。 我认为你的SSH的远端在sed的输出到达之前关闭连接。

缓冲通过子shell和管道可能会更好,因为cat等待输入关闭,而不是等待前台进程完成:

 ssh root@server1 "(ls -l /tmp/abcdefgh 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')) | cat"