Предполагая, что после отправки EOF соединение останется незанятым, вы можете использовать параметр -w timeout
, который работает для тайм-аута
, равного ноль (в отличие от дурацкого -q
варианта ...)
cat tsmmessage.bin | nc -u localhost 4300 -w0
Если бы существовала только переменная, значение которой является пробелом ... Или, в более общем смысле, содержит пробел.
cat${IFS}file.txt
Значение по умолчанию IFS
- это пробел, табуляция, новая строка. Все эти символы - пробелы. Если вам нужен единственный пробел, вы можете использовать $ {IFS% ??}
.
Точнее, причина, по которой это работает, связана с тем, как работает разбиение слов. Критично, это применяется после подстановки значений переменных. А при разделении слов каждый символ в значении IFS
рассматривается как разделитель, поэтому по построению, пока для IFS
установлено непустое значение, $ {IFS }
разделяет слова.Если IFS
содержит более одного символа, каждый символ является разделителем слов. Последовательные символы разделителя, которые являются пробелами, обрабатываются как один разделитель, поэтому результатом раскрытия cat $ {IFS} file.txt
являются два слова: cat
и file .txt
. Разделители без пробелов обрабатываются отдельно, с чем-то вроде IFS = ',.'; cat $ {IFS} file.txt
, cat
получит два аргумента: пустой аргумент и file.txt
.
Я нашел способ, предполагающий, что оболочка поддерживает csh
-подобное расширение фигурных скобок, например ksh
, bash
или yash -o brace-expand
( zsh
поддерживает раскрытие фигурных скобок, но не в качестве первого аргумента, поскольку он конфликтует с группировкой команд) :
{cat,file.txt}
таким образом вам не нужно использовать пробелы в аргументе.
Один из вариантов - использовать значение IFS с раскрытием переменной:
$ echo Hello! > file.txt
$ IFS=:
$ a=cat:file.txt
$ $a
Hello!