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が必要です(ただし、進行状況情報はどういうわけか取得されると思います)。何か案が?
前もって感謝します!!