Php 使用s3cmd进行棘手的stderr重定向
我有一些奇怪的行为从s3cmd重定向stdout和stderr。例如:Php 使用s3cmd进行棘手的stderr重定向,php,bash,shell,s3cmd,Php,Bash,Shell,S3cmd,我有一些奇怪的行为从s3cmd重定向stdout和stderr。例如: $ 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 n
$ 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
exec('s3cmd put test s3://non_existent_bucket 2>&1', $output);
实际上,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的方法,因此我将按如下方式执行:
$ 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
exec('s3cmd put test s3://non_existent_bucket 2>&1', $output);
在这里,我没有从任何一个流得到任何输出。我想我是因为s3cmd检测到它没有连接到tty而失去了stdout,但是stderr我仍然不明白为什么它没有被捕获
尝试使用popen()和exec()会得到相同的结果
我需要整个输出,或者至少是标准输出(尽管我猜进度信息会被某种方式获取)。有什么想法吗
提前谢谢 详细信息是一个--progress
/--no progress
标志,描述如下:
$ 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
exec('s3cmd put test s3://non_existent_bucket 2>&1', $output);
显示或不显示进度表。在TTY(例如控制台或xterm)上运行时,默认显示进度表。如果不在TTY上(例如,输出被重定向到某处或从cron运行),默认情况下不显示进度表
因此,看起来s3cmd将执行类似于isatty(0)
的操作来确定是否将进度详细信息写入STDOUT,但是如果您明确指定-[no-]progress
,它将强制一种行为或另一种行为
尝试:
详细信息包含一个--进度
/--无进度
标志,描述如下:
$ 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
exec('s3cmd put test s3://non_existent_bucket 2>&1', $output);
显示或不显示进度表。在TTY(例如控制台或xterm)上运行时,默认显示进度表。如果不在TTY上(例如,输出被重定向到某处或从cron运行),默认情况下不显示进度表
因此,看起来s3cmd将执行类似于isatty(0)
的操作来确定是否将进度详细信息写入STDOUT,但是如果您明确指定-[no-]progress
,它将强制一种行为或另一种行为
尝试:
你尝试过更复杂但更细粒度的控制吗?我没有,但现在我做了,如果我没有做错什么,问题是一样的:你尝试过更复杂但更细粒度的控制吗?我没有,但现在我做了,如果我没有做错什么,问题是一样的:sOk!这是有效的:)我在文档中完全忽略了这一点。谢谢!但我还是想得到stderr。稍后我会把你的答案标记为接受,看看是否有人(甚至是你)在这方面帮助我。管理员:两个答案可以被标记为已接受吗?这是不是也得到了标准?我原以为
2>&1
应该得到它。非常奇怪-这有点表明没有向STDERR写入任何内容。如果成功地将STDERR记录到文件中的命令exec()
会怎么样?该文件是否仍然捕获错误消息?i、 e.exec('s3cmd put test s3://不存在\ bucket 2>log')
还要验证PHP脚本的工作目录中是否存在test
(如果没有,我也会收到STDERR消息)。啊!不,我错了,我再次测试了它,事实上它获取了所有的输出。非常感谢达维兰多!好啊这是有效的:)我在文档中完全忽略了这一点。谢谢!但我还是想得到stderr。稍后我会把你的答案标记为接受,看看是否有人(甚至是你)在这方面帮助我。管理员:两个答案可以被标记为已接受吗?这是不是也得到了标准?我原以为2>&1
应该得到它。非常奇怪-这有点表明没有向STDERR写入任何内容。如果成功地将STDERR记录到文件中的命令exec()
会怎么样?该文件是否仍然捕获错误消息?i、 e.exec('s3cmd put test s3://不存在\ bucket 2>log')
还要验证PHP脚本的工作目录中是否存在test
(如果没有,我也会收到STDERR消息)。啊!不,我错了,我再次测试了它,事实上它获取了所有的输出。非常感谢达维兰多!