Перенаправление stdout игнорирует строки без новой строки

Похоже, что это ваш адрес шлюза использование 192.168.1.1 не соответствует адресу вашего маршрутизатора. Если вы используете статический IP-адрес, детали в значительной степени соответствуют вашей сети, или она не может работать.

Начните с IP-адреса вашего маршрутизатора. Это может быть 192.168.1.254. Это могло быть 10.11.12.13. Это могло быть что-то совсем другое.

Затем вам понадобится сетевая маска, опять же из конфигурации вашего маршрутизатора, которая будет либо 24, либо что-то вроде 255.255.255.0.

Для каждых 255 в маске сети вам необходимо скопировать соответствующие числа с IP-адреса вашего маршрутизатора. Таким образом, три лота 255 означают, что вы копируете первые три группы чисел.(Если у вас есть только маска сети с одним номером, например 24, разделите ее на 8, и результат даст вам количество чисел, которые вы должны скопировать.) Наконец, вам нужно назначить неиспользуемые значения, чтобы в итоге получилось четыре группы номеров.

Предположим, ваш маршрутизатор - 10.1.1.254, а ваша сетевая маска - 255.255.0.0. Затем вы должны скопировать 10.1 и получить оставшиеся два числа в диапазоне 1-254. Результатом будет ваш IP-адрес, например 10.1.44.66, но не используйте группу номеров, которая уже используется!

2
22.09.2018, 08:52
2 ответа

Вы получили неполный вывод строк как часть той же строки в том месте, где была напечатана новая строка. Части строки буферизуются внутри read, , вот что она делает:

Утилита read должна считывать одну логическую строку со стандартного ввода

. ] Например, это выводит через одну секунду, а не .

(echo -n foo ; sleep 1 ; echo bar) | (read x ; echo "<$x>")

Если вы хотите перехватывать ввод меньшими частями, чем полные строки, вам нужно сделать что-то еще, например. с Перл. Это напечатает (с новой строкой перед последней >, так как в отличие от read, Perl не обрабатывает последнюю новую строку особенно. Не должно иметь значения с окраской.)

(echo -n foo ; sleep 1 ; echo bar) | 
    perl -e '$|=1; while(sysread STDIN,$a,9999) { print "<$a>"}'

Если у вас есть управляющие коды для цветов (RED и COLORRESET), экспортированные в среду, вы можете использовать их из Perl сценарий как здесь:

perl -e '$|=1; while(sysread STDIN,$a,9999) {print "$ENV{RED}$a$ENV{COLORRESET}"}'
5
27.01.2020, 21:54

В Bash вы можете использовать параметр -d для встроенной функции read, которая определяет символ конца строки. man bash утверждает следующее:

-d delim    The first character of delim is used to terminate the input line, 
            rather than newline.

Если он не определен, read ожидает появления \n, чтобы считать строку строкой. Но когда вы используете опцию -d, вы можете установить NUL в качестве разделителя. Конечно, вам также необходимо завершить ввод NUL.

Пример:

printf "%s\0" $'x\n' y z | while IFS='' read -r -d $'\0' line
    do
        printf "%s\n" "$line"
    done

Результат:

x

y
z

Еще раз, но теперь printf в цикле while не соответствует \n.

printf "%s\0" $'x\n' y z | while IFS='' read -r -d $'\0' line
    do
        printf "%s" "$line"
    done

Вывод:

x
yz(...)

Я добавил (...), и это означает, что в конце второй строки нет End-Of-Line. Но текст все равно обрабатывается и печатается.

1
27.01.2020, 21:54

Теги

Похожие вопросы