1

stdoutとstderrをs3cmdからリダイレクトする奇妙な動作があります。例えば:

$ touch test

$ s3cmd put test s3://non_existent_bucket
test -> s3://non_existent_bucket/test  [1 of 1]
 4 of 4   100% in    0s    88.17 B/s  done
ERROR: S3 error: 404 (NoSuchBucket): The specified bucket does not exist

この出力は(私が間違っていない場合)一部stdoutと一部stderrです。これは次のように表示されます。

$ s3cmd put test s3://non_existent_bucket 2> log
test -> s3://non_existent_bucket/test  [1 of 1]
 4 of 4   100% in    0s   120.11 B/s  done

$ cat log
ERROR: S3 error: 404 (NoSuchBucket): The specified bucket does not exist

事実上、stderrはリダイレクトされますが、stdoutとstderrの両方が必要です。最初にstdoutだけを試してみましょう:

$ s3cmd put test s3://non_existent_bucket > log
ERROR: S3 error: 404 (NoSuchBucket): The specified bucket does not exist

$ cat log

コマンドの後に書かれていないので、stdoutが実際にリダイレクト(または何か)していることは理解していますが、ログファイルに記録されません。どういうわけか、ttyに接続されているかどうかを検出し、最初のケースでのみこの種のデータを出力すると思います。

同様に、両方のストリームをリダイレクトしようとすると、stderrは取得されますが、必要なstdout出力は取得されません。

$ s3cmd put test s3://non_existent_bucket >& log

$ cat log
ERROR: S3 error: 404 (NoSuchBucket): The specified bucket does not exist

実際、私がする必要があるのは、これをPHPから呼び出して、完全な出力を取得することです。コマンドを実行してstdoutを取得する方法しか見つけられなかったので、次のように実行しています。

exec('s3cmd put test s3://non_existent_bucket 2>&1', $output);

そして、ここでは、どちらのストリームからも出力を取得していません。s3cmdがttyに接続されていないことを検出したため、stdoutを失っていると思いますが、stderrは、なぜキャッチされないのかまだわかりません。

popen()とexec()を試してみると、同じ結果が得られます。

出力全体、または少なくともstdoutが必要です(ただし、進行状況情報はどういうわけか取得されると思います)。何か案が?

前もって感謝します!!

4

1 に答える 1

1

s3cmdのマニュアルページには、次のような説明とともに--progress/フラグの詳細--no-progressが記載されています。

プログレスメーターを表示するかどうか。TTY(コンソールやxtermなど)で実行している場合、デフォルトでは進行状況メーターが表示されます。TTYにない場合(たとえば、出力がどこかにリダイレクトされるか、cronから実行されている場合)、デフォルトでは進行状況メーターは表示されません。

したがって、s3cmdはisatty(0)進行状況の詳細をSTDOUTに書き込むかどうかを決定するようなことをするように見えますが、明示的に指定--[no-]progressすると、どちらかの動作が強制されます。

試す:

exec('s3cmd --progress put test s3://non_existent_bucket 2>&1', $output);
于 2012-07-03T13:20:32.740 に答える