Есть ли ограничение на длину строки при вставке в терминал в Linux?

Да, можно синхронизировать часы через GPS без подключения к сети. Вам понадобится GPS-приемник и антенна на крыше (и обычно последовательный порт для подключения приемника )

.

Можно использовать сигнал GSM, так как большинство операторов мобильной связи также обеспечивают точные часы по сигнальному каналу.

Также (как очень странное решение )возможно использование D-канала PRI ISDN (, если у провайдера есть точное время по этому каналу)

РЕДАКТИРОВАТЬ :Вы также можете купить выделенный сервер времени. Вот несколько производителей (ни с одним из них не связаны ):1 , 2

14
09.04.2021, 17:53
4 ответа

4095 — это предел длины внутреннего редактора дисциплин линии tty в Linux. Из справочной страницы termios(3):

  • The maximum line length is 4096 chars (including the terminating newline character); lines longer than 4096 chars are truncated. After 4095 characters, input processing (e.g., ISIG and ECHO* processing) continues, but any input data after 4095 characters up to (but not including) any terminating newline is discarded. This ensures that the terminal can always receive more input until at least one line can be read.

См. также соответствующий код в ядре Linux .

Например, если вы введете:

$ wc -cEnter

Введите в собственном строковом редакторе оболочки (readline в случае bash )отправляет строку в оболочку. Когда командная строка завершена, оболочка готова к ее выполнению, поэтому она оставляет свой собственный строковый редактор, переводит терминальное устройство обратно в канонический (, также известный как , приготовленный)режим, который включает этот грубый строковый редактор (фактически реализован в драйвере tty в ядре ).

Затем, если вы вставите строку размером 5000 байт, нажмите Ctrl + D , чтобы отправить эту строку, и еще раз, чтобы сказать wc, что все готово, вы см. 4095в качестве вывода.

(Обратите внимание, что это ограничение не распространяется на собственный строковый редактор bash, вы увидите, что вы можете вставить гораздо больше данных по приглашению оболочки bash).

Таким образом, если ваше принимающее приложение считывает строки ввода со своего стандартного ввода, а его стандартный ввод является терминальным устройством, и это приложение не реализует свой собственный редактор строк (, как это делает bash), и не изменяет в режиме ввода вы не сможете вводить строки длиннее 4096 байт (, включая завершающий символ новой строки ).

Однако вы можете отключить строковый редактор терминального устройства (с помощьюstty -icanon)перед запуском принимающего приложения, чтобы оно считывало ввод непосредственно при вводе.Но тогда вы не сможете использовать Backspace / Ctrl + W , например, для редактирования ввода или Ctrl + . D для завершения ввода.

Если ввести:

$ saved=$(stty -g); stty -icanon icrnl; head -n1 | wc -c; stty "$saved"Enter

вставьте строку длиной 5000 байт и нажмите Введите , вы увидите 5001.

25
28.04.2021, 22:53

Как упоминалось в ответе Стефана Шазеласа, буфер редактирования ввода драйвера терминала имеет ограниченный размер.

Вместо вставки в терминал вы можете перенаправить вывод kafka-console-producer.shв файл:

kafka-console-producer.sh > kafka.out

Затем загрузите файл на сервер и используйте его в качестве входных данных для любой программы, в которую вы вставляли входные данные.

some-program < kafka.out
2
28.04.2021, 22:53

Да, существует ограничение на длину командной строки или, точнее, на длину аргументов, передаваемых в execve. См. также «man execve».

Давным-давно этот предел составлял 128 КБ. В современных ядрах она намного выше.

Таким образом, ваше усечение до 4096 не связано с этим.

На самом деле командная строка никогда не усекается автоматически. Если аргументы слишком длинные для execve, вызов завершится ошибкой.

0
28.04.2021, 22:53

Возможно, это -не по теме, поскольку вопрос был в том, почему/где, а не как. Мне все равно предлагается написать это, потому что в настоящее время я могу найти ошибку,уже одобренный ответ (в результате поспешного прочтения вопроса ), предлагающего вывести сообщение в файл, а затем направить этот файл в скрипт.

Stéphane Chazelas очень хорошо ответил на актуальный вопрос, а именно, что ограничение длины ввода в 4095 символов + новая строка исходит из жесткого -закодированного ограничения ядра Linux на то, как терминалы работают в каноническом режиме (терминалы обычно в каноническом режиме ).

Чтобы дополнительно продемонстрировать это на конкретной установке (, дающей ответ на вопрос ), мы можем исправить скрипт kafka-console-producer.sh, чтобы избавиться от ограничения, следующим образом:

#!/bin/bash
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx512M"
fi

tty_orig=$(stty -g)
stty -icanon
$(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"
stty "$tty_orig"

Таким образом, гораздо более длинные сообщения могут непрерывно вставляться в скрипт без усечения до 4095 символов. Вы также можете создать сценарий-оболочку, который вызывает исходный сценарий kafka-console-producer.sh, если он исходит из набора приложений Kafka, и вы не хотите его редактировать.

0
28.04.2021, 22:53

Теги

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