在shell传递结果" python -m SimpleSTTPServer"管道

时间:2018-05-08 06:58:20

标签: python bash shell simplehttpserver

我正在尝试发送Python CLI" SimpleHTTPServer"的输出。命令到管道,以grep结果。但似乎输出的第一行没有传递给管道,我无法弄清楚原因。

以下是运行命令的典型输出。第一行声明它已启动服务器及其正在使用的端口。然后它会报告各种网络活动。因此,如果我运行python -m SimpleHTTPRequest然后加载index.html页面两次,则输出如下所示:

$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
127.0.0.1 - - [07/May/2018 21:08:31] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [07/May/2018 21:08:36] "GET / HTTP/1.1" 200 -

如果我将stderr重定向到stdout,然后发送到管道,我希望所有行都会在管道后到达stdin。但这似乎并没有发生。当我在管道后面使用sed并使用&#34时所有行前缀时,这是stdin:",输出的第一行不会出现。

$ python -m SimpleHTTPServer 2>&1 | sed "s/.*/This is stdin\:&/"
This is stdin:127.0.0.1 - - [07/May/2018 23:35:07] "GET / HTTP/1.1" 200 -
This is stdin:127.0.0.1 - - [07/May/2018 23:35:11] "GET / HTTP/1.1" 200 -

我尝试了不同的重定向选项。我可以使用stdoutstderr重定向到1>&2,这会使所有三行显示而不会像预期的那样传递到管道。我尝试根据this answer的讨论,使用stdinstdout重定向到0>$1,但是没有将任何行发送到管道。我尝试将python命令放在大括号中,基于this answer,但它没有改变结果。很明显,网络活动日志正在发送到stderr,但不清楚第一行的去向。我也在管道后尝试grep,结果相同。在所有情况下,输出的第一行都没有到达管道后的stdin

看来python" SimpleHTTPServer"第一行输出不会转到stdoutstderr,因此我无法将其传递给管道。发生了什么事?

如果有人有更好的解决方法,这就是我想要做的事情。我想要一个单行shell命令,它将(1)使用python SimpleHTTPServer启动本地服务器; (2)找出它使用的端口号;然后(3)在该localserver端口打开浏览器。我知道SimpleHTTPServer的默认端口是8000;但是如果那个已经在使用,它会分配一个不同的,所以我需要知道。我也知道我可以告诉SimpleHTTPServer使用什么端口,但如果该端口已经在使用,那么命令将失败。我知道在python中你可以问到正在使用什么端口,但是我需要一个shell脚本来从不同的应用程序运行。所以我决定在启动服务器时监听命令的输出,重新编写4位端口号,使其成为变量,然后使用该变量在浏览器中打开正确的端口。我期待以下工作,但它不是。

$ port=$(python -m SimpleHTTPServer 2>&1 | grep -o '[0-9]\{4\}') ; open http://localhost:$port

0 个答案:

没有答案