Иногда я пытаюсь выполнить перенаправление (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'
очевидно не приводит к выводу, если нет строк, содержащих обе «фу» и «бар».