Назад | Перейти на главную страницу

Что могло заблокировать вывод команды?

Иногда я пытаюсь выполнить перенаправление (2> & 1), и некоторые / все результаты выглядят беззвучно.

например

wget -O- http://localhost/test.txt 2>&1

Я ожидал увидеть слияние содержимого test.txt и вывода передачи, но вместо этого результат будет выводиться только на stderr, а не на stdout:

--2013-03-18 14:53:41--  http://localhost/test.txt
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 9 [text/plain]
Saving to: `STDOUT'

 0% [                                       ] 0           --.-K/s              1100%     
    [======================================>] 9           --.-K/s   in 0s      

2013-03-18 14:53:41 (2.09 MB/s) - written to stdout [9/9]

Разве stdout не должен был выводить это на экран?

И все еще:

wget -O- http://localhost/test.txt 2>&1 > test.stdout

приводит к записи файла в test.stdout, как и ожидалось.

Точно так же я видел это поведение со сценариями ожидания (send_user) и несколькими каналами grep. например

/myexpectscript | grep 'blah'

работает и фильтрует все строки, кроме тех, которые содержат "бла", но

/myexpectscript | grep 'foo' | grep 'bar'

приводит к пустому выводу.

Я обнаружил это, когда хотел использовать тройник для дублирования вывода. например

wget -O- http://localhost/test.txt 2>&1 | tee

не приводит к выходу вообще, тогда как:

wget -O- http://localhost/test.txt | tee

приводит к:

--2013-03-18 15:16:42--  http://localhost/ddns/checkip.php
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 9 [text/plain]
Saving to: `STDOUT'

127.0.0.1100%[======================================>] 9           --.-K/s   in 0s      

2013-03-18 15:16:42 (2.30 MB/s) - written to stdout [9/9]

(Обратите внимание, что в строке 8 указано содержимое test.txt "127.0.0.1")

При каких обстоятельствах перенаправленный вывод блокируется? Почему предполагаемый вывод на стандартный вывод с помощью wget работает только при перенаправлении в файл или команду?

После обновления пару раз я обнаружил, что теперь поведение соответствует ожиданиям.

$ wget -O- http://localhost/test.txt 2>&1
--2015-10-06 14:39:58--  http://localhost/test.txt
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10 [text/plain]
Saving to: 'STDOUT’

-                             0%[                                             ]       0  --.-KB/s             It works!
-                           100%[============================================>]      10  --.-KB/s   in 0s     

2015-10-06 14:39:58 (918 KB/s) - written to stdout [10/10]

Как видите, в конце первой строки прогресса «Работает!» (содержимое текстового файла) правильно объединено с выводом.

Перед лицом любого другого разумного объяснения я могу только сделать вывод, что это, должно быть, была либо ошибка bash, либо терминальная ошибка косметического характера.

Вот wget -O- http://localhost/test.txt 2>&1 записывает загруженный контент в stdout.

grep 'foo' | grep 'bar' очевидно не приводит к выводу, если нет строк, содержащих обе «фу» и «бар».