Различные стили перенаправления с 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 в комментарии, поскольку индикаторы для этого являются правильной дорожкой …)

  • Pipe Fail (141) при выходе трубопровода в тройник - почему?
  • Как использовать тройник для перенаправления на grep
  • Перенаправление вывода в зависимости от регулярного выражения grep
  • Операторы печати в реальном времени с тройником в интерактивном скрипте
  • Как использовать тройник для захвата STDOUT из кодового блока в имя файла, определенное в блоке?
  • Перенаправить все вывод сценария bash (изнутри скрипта) в два файла: один append, one rewrite; но отбрасывать вывод на консоль
  • команда, как wc, но с тиковым поведением
  • tee stdout to stderr?
  • Обертка скрипта оболочки с тройником
  • Подробный вывод в лог-файле и простой вывод на экран?
  • tee -a не воссоздает файл
  • Linux и Unix - лучшая ОС в мире.