Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用s3cmd进行棘手的stderr重定向_Php_Bash_Shell_S3cmd - Fatal编程技术网

Php 使用s3cmd进行棘手的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

我有一些奇怪的行为从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 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消息)。啊!不,我错了,我再次测试了它,事实上它获取了所有的输出。非常感谢达维兰多!