В то время как Emacs является, прежде всего, редактором и IDE ¹, это, оказывается, соответствует Вашей проблеме очень хорошо. Можно запустить программу в окне Emacs, и Emacs отображает его в простом терминале бесконечной ширины и высоты. Если курсор будет в конце буфера, то окно прокрутит, поскольку программа производит вывод; если Вы переместите курсор, то окно останется помещенным, когда вывод растет.
Ввести M-x shell RET
(т.е. Alt+x shell
Возвратитесь) запустить оболочку в буфере Emacs. Ввести C-u M-x shell RET
или M-1 M-x shell RET
запустить другую оболочку. Можно запустить программу в каждой оболочке и расположить буферы в нескольких окнах, как Вы желаете.
¹ Это, как иногда говорят, лучшая ОС, чем редактор, но только людьми, которые не используют его — это - просто шутка.
Я наткнулся на это, когда искал в Google примерно ту же проблему. Оказалось, что проблема заключалась в том, что netcat был убит bash сразу после того, как все данные были втянуты, без всякого шанса получить ответ.
Мое решение состояло в том, чтобы добавить некоторую задержку после передачи данных по конвейеру, например:
(echo INFO; sleep 1) | nc redis.service.consul 6379
С файлом это может выглядеть так:
(cat tsmmessage.bin; sleep 5) | nc -u localhost 4300
Предполагая, что после отправки EOF соединение останется незанятым, вы можете использовать параметр -w timeout
, который работает для тайм-аута
, равного ноль (в отличие от дурацкого -q
варианта ...)
cat tsmmessage.bin | nc -u localhost 4300 -w0
Без флага -q
ваш экземпляр netcat
будет ждать вечно. В UDP нет сообщения «конец потока», поэтому netcat
не может узнать, что и stdin , и сетевое соединение завершены.
Например, при использовании TCP/IP все работает как положено:
nc -l localhost 4300 # Window 1
nc localhost 4300 </etc/group # Window 2
Но, как вы определили, использование UDP/IP никогда не заканчивается:
nc -u -l localhost 4300 # Window 1
nc -u localhost 4300 </etc/group # Window 2
Здесь на помощь приходит флаг -q
. Но, к сожалению, он не принимает значение 0
. Он также не будет принимать целочисленные значения, отличные от -. Вот лучшая альтернатива, которую я могу предложить без обращения к timeout
или какой-либо другой внешней утилите:
nc -u -l localhost 4300 # Window 1
nc -q 1 -u localhost 4300 </etc/group # Window 2
Даже здесь невозможно netcat
изящно установить тайм-аут прослушивания. (Параметр тайм-аута -w
игнорируется, а -q
не имеет значения. )Нечто подобное может быть полезно в практической ситуации, чтобы netcat
убивался через 90 секунд:
timeout 90 nc -u -l localhost 4300 # Window 1
nc -q 1 -u localhost 4300 </etc/group # Window 2