Различные стили перенаправления с netcat и tee дают разные результаты

При попытке проследить простой HTTP-запрос GET и его ответ с помощью nc , я сталкиваюсь с чем-то странным.

Это, к примеру, отлично работает: файл заканчивается, содержащий запрос HTTP GET, а out файл – ответ.

 $ mkfifo p $ (nc -l 4000 < p | tee in | nc web-server 80 | tee out p)& [1] 8299 $ echo "GET /sample" | nc localhost 4000 This is contents of /sample... $ cat out This is contents of /sample... $ 

Однако, если я заменю tee out p выше на tee out >p , тогда out файл окажется пустым.

 $ (nc -l 4000 < p | tee in | nc web-server 80 | tee out > p)& [1] 8312 $ echo "GET /sample" | nc localhost 4000 $ cat out $ 

Почему это должно быть так?

EDIT: Я нахожусь на RHEL 5.3 (Тиканга).

2 Solutions collect form web for “Различные стили перенаправления с netcat и tee дают разные результаты”

Проблема в том, что вы используете переадресацию оболочки для чтения и записи в один и тот же файл. Проверьте p потом, он также будет пустым. Оболочка открывает его в режиме чтения, обрезая файл, пока он настраивает конвейер, прежде чем он запускает команды. Однако использование tee , так как оно открывает сам файл, означает, что файл не усекается до тех пор, пока содержимое не будет прочитано для ввода. Это хорошо известное и документированное поведение и причина, по которой вы не можете просто использовать перенаправления для внесения встроенных изменений в файлы.

Из tee майнинга FreeBSD:

 DESCRIPTION The tee utility copies standard input to standard output, making a copy in zero or more files. The output is unbuffered. 

небуферизованный – это кий, перенаправление вывода Bash (или вашей оболочки) ( > p ), вероятно, буферизировано, что вызывает различное поведение.

(Прошу прощения, я не могу быть более уверен в этом, но я принимаю +1 в комментарии, поскольку индикаторы для этого являются правильной дорожкой …)

  • Перенаправить все вывод сценария bash (изнутри скрипта) в два файла: один append, one rewrite; но отбрасывать вывод на консоль
  • Как использовать stdin с тройником или другими типами труб или перенаправление выходов?
  • Замена процесса тройником и пастой
  • Как работает `: w! Sudo tee%`
  • эхо в файл с другим пользовательским разрешением
  • Перенаправить вывод сценария в / dev / tty1, а также отобразить вывод в файл
  • Добавлять файл, выводить на экран и перенаправлять из stderr все сразу, без тройника
  • команда, как wc, но с тиковым поведением
  • Перенаправление вывода
  • Как использовать тройник для перенаправления на grep
  • Печать / тройник для консоли, не передавая выход в трубу
  • Linux и Unix - лучшая ОС в мире.