【发布时间】:2012-07-03 12:58:11
【问题描述】:
我有一些奇怪的行为从 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
这个输出是(如果我没有弄错的话)部分标准输出和部分标准错误。如下所示:
$ 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。让我们先试试标准输出:
$ 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 调用它并获得完整的输出。我只找到了执行命令和检索标准输出的方法,所以我这样做如下:
exec('s3cmd put test s3://non_existent_bucket 2>&1', $output);
在这里,我没有从任何一个流中得到任何输出。我想我丢失了标准输出,因为 s3cmd 检测到它没有连接到 tty,但是标准错误我仍然不明白为什么它没有被捕获。
尝试使用 popen() 和 exec() 得到相同的结果。
我需要整个输出,或者至少是标准输出(尽管我猜进度信息会以某种方式被抓取)。有什么想法吗?
提前致谢!!
【问题讨论】:
-
您是否尝试过
proc_open()提供的更复杂但更细粒度的控件? -
我没有,但现在我做到了,如果我没有做错什么,问题是一样的:s