2

私は BASH 4 を使用しています。出力の種類を示すために出力の前に合法的に追加する方法を見つけようとしています。私はこのようなものでこれを行うことができます...

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
...

SSH経由でログインしてインタラクティブに実行すると、これがうまくいくようです。ただし、コマンドを引用符で囲んで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 status の結果を stderr の結果として表示します (これは正しいはずです)。

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

1 に答える 1

2

sshをまったく使用せずに、コンピューターで次のことを試しました。

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

2 行目の $ はタイプミスではありません。これらの sed コマンドは、完全にバックグラウンドで実行されています。 lsエラーメッセージを表示し、シェルがプロンプトを出力するのに十分な時間で終了してから、sed が何かを出力する機会を得ました。sedの出力が到着する前に、sshの向こう側が接続を閉じていると思います。

サブシェルとパイプを介したバッファリングcatは、フォアグラウンド プロセスが終了するのを待つのではなく、入力が閉じるのを待つため、より適切に機能する可能性があります。

ssh root@server1 "(ls -l /tmp/abcdefgh 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')) | cat"
于 2010-10-21T06:47:59.890 に答える