Я пытаюсь отправить результаты команды Python CLI "SimpleHTTPServer" в канал, чтобы получить результаты. Но похоже, что первая строка вывода не передается в канал, и я не могу понять, почему.
Вот типичный результат выполнения команды. В первой строке указывается, что он запустил сервер и порт, который он использует. Затем он сообщает о различных сетевых операциях по мере их возникновения. Так что, если я запускаю 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
после канала и у него есть префикс всех строк с «This is 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 -
Я пробовал разные варианты перенаправления. Я могу перенаправить с stdout
на stderr
, используя 1>&2
, и все три строки отображаются без перехода в канал, как и ожидалось Я попытался перенаправить с stdin
на stdout
с 0>$1
, основываясь на обсуждении в этого ответа , но это не отправило ни одной строки в канал. Я попытался поместить команду python в фигурные скобки, основываясь на этом ответе , но результат не изменился. Ясно, что журналы сетевой активности отправляются на stderr
, но неясно, куда идет первая строка. Я также пытался с grep
после трубы, с тем же результатом. Во всех случаях первая строка вывода не поступает в stdin
после канала.
Похоже, что первая строка вывода python "SimpleHTTPServer" не собирается в stdout
или stderr
, поэтому я не могу передать его в канал. Что происходит?
В случае, если у кого-то есть способ лучше, вот что я пытаюсь сделать. Мне нужна однострочная команда оболочки, которая (1) запустит локальный сервер, используя python SimpleHTTPServer; (2) выяснить, какой номер порта он использует; затем (3) откройте браузер на этом порту локального сервера. Я знаю, что порт SimpleHTTPServer по умолчанию - 8000; но если он уже используется, он назначит другой, поэтому мне нужно это знать. Я также знаю, что могу сказать SimpleHTTPServer, какой порт использовать, но если этот порт уже используется, команда не выполнится. Я знаю, что в Python вы можете спросить, какой порт используется, но мне нужен сценарий оболочки для запуска из другого приложения. Итак, я остановился на выводе команды при запуске сервера, регулярном выражении 4-значного номера порта, присвоении ему переменной, а затем использовании этой переменной для открытия нужного порта в браузере. Я ожидаю, что следующее сработает, но это не так.
$ port=$(python -m SimpleHTTPServer 2>&1 | grep -o '[0-9]\{4\}') ; open http://localhost:$port